无效 XML。 ---> 在包含 FetchXML 的插件上
Invalid XML. ---> On A Plugin Containing FetchXML
当合约名称中有 & 或其他无效字符时会发生这种情况。我的问题是,如何处理这些无效字符??!!
Microsoft.Crm.CrmException: Invalid XML. --->
System.Xml.XmlException: An error occurred while parsing EntityName.
Line 13, position 117.
at System.Xml.XmlTextReaderImpl.Throw(Exception e)
at System.Xml.XmlTextReaderImpl.HandleEntityReference(Boolean isInAttributeValue, EntityExpandType expandType, Int32&
charRefEndPos)
at System.Xml.XmlTextReaderImpl.ParseAttributeValueSlow(Int32 curPos, Char quoteChar, NodeData attr)
at System.Xml.XmlTextReaderImpl.ParseAttributes()
at System.Xml.XmlTextReaderImpl.ParseElement()
at System.Xml.XmlTextReaderImpl.ParseElementContent()
at System.Xml.Linq.XContainer.ReadContentFrom(XmlReader r)
at System.Xml.Linq.XContainer.ReadContentFrom(XmlReader r, LoadOptions o)
at System.Xml.Linq.XDocument.Load(XmlReader reader, LoadOptions options)
at Microsoft.Crm.Platform.Server.Utility.XmlHelper.LoadXmlInfo(String
xmlInfo)
at Microsoft.Crm.Query.EntityExpression.ExtractPlatformName(String fetchXml, XElement element).
问题代码如下:
//run a fetchXml query to get how many contract lines have these values
string fetchLines = @"
<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='false'>
<entity name='new_yummycontractline'>
<attribute name='new_yummycontractlineid' />
<filter type='and'>
<condition attribute='new_servingtime' operator='eq' value='" + servingTime.ToString() + @"' />
<condition attribute='new_servinggroup' operator='eq' value='" + servingGroup.ToString() + @"' />
<condition attribute='new_destination' operator='eq' value='" + location.ToString() + @"' />
<condition attribute='statecode' operator='eq' value='0' />
</filter>
<link-entity name='new_yummycontract' from='new_yummycontractid' to='new_contractid' link-type='inner' alias='ad'>
<filter type='and'>
<condition attribute='new_yummycontractid' operator='eq' uiname='" + uiname + @"' uitype='new_yummycontract' value='" + contractId.ToString() + @"' />
</filter>
</link-entity>
</entity>
</fetch>";
EntityCollection results = service.RetrieveMultiple(new FetchExpression(fetchLines));
我用了webutility.htmlencode(uiname)
,问题似乎已经消失了。我猜 uiname 有一些无效的 XML 字符,这个方法解决了这个问题!
uiname
和 uitype
不是您的 fetchXml 工作所必需的。这些用于演示而不用于查询。我认为这些是由高级查找编辑器添加的;因此 "UI"
您可以像这样重写 XML 的那个部分
<link-entity name='new_yummycontract' from='new_yummycontractid' to='new_contractid' link-type='inner' alias='ad'>
<filter type='and'>
<condition attribute='new_yummycontractid' operator='eq' value='" + contractId.ToString() + @"' />
</filter>
</link-entity>
不确定您使用的是哪个版本的 .NET,但您也可以使用 $
特殊字符来指示 interpolated string,我认为这可以提高可读性并减少字符串连接
string fetchLines = @$"
<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='false'>
<entity name='new_yummycontractline'>
<attribute name='new_yummycontractlineid' />
<filter type='and'>
<condition attribute='new_servingtime' operator='eq' value='{servingTime}' />
<condition attribute='new_servinggroup' operator='eq' value='{servingGroup}' />
<condition attribute='new_destination' operator='eq' value='{location}' />
<condition attribute='statecode' operator='eq' value='0' />
</filter>
<link-entity name='new_yummycontract' from='new_yummycontractid' to='new_contractid' link-type='inner' alias='ad'>
<filter type='and'>
<condition attribute='new_yummycontractid' operator='eq' value='{contractId}' />
</filter>
</link-entity>
</entity>
</fetch>";
当合约名称中有 & 或其他无效字符时会发生这种情况。我的问题是,如何处理这些无效字符??!!
Microsoft.Crm.CrmException: Invalid XML. ---> System.Xml.XmlException: An error occurred while parsing EntityName. Line 13, position 117. at System.Xml.XmlTextReaderImpl.Throw(Exception e) at System.Xml.XmlTextReaderImpl.HandleEntityReference(Boolean isInAttributeValue, EntityExpandType expandType, Int32& charRefEndPos) at System.Xml.XmlTextReaderImpl.ParseAttributeValueSlow(Int32 curPos, Char quoteChar, NodeData attr) at System.Xml.XmlTextReaderImpl.ParseAttributes() at System.Xml.XmlTextReaderImpl.ParseElement() at System.Xml.XmlTextReaderImpl.ParseElementContent() at System.Xml.Linq.XContainer.ReadContentFrom(XmlReader r) at System.Xml.Linq.XContainer.ReadContentFrom(XmlReader r, LoadOptions o) at System.Xml.Linq.XDocument.Load(XmlReader reader, LoadOptions options) at Microsoft.Crm.Platform.Server.Utility.XmlHelper.LoadXmlInfo(String xmlInfo) at Microsoft.Crm.Query.EntityExpression.ExtractPlatformName(String fetchXml, XElement element).
问题代码如下:
//run a fetchXml query to get how many contract lines have these values
string fetchLines = @"
<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='false'>
<entity name='new_yummycontractline'>
<attribute name='new_yummycontractlineid' />
<filter type='and'>
<condition attribute='new_servingtime' operator='eq' value='" + servingTime.ToString() + @"' />
<condition attribute='new_servinggroup' operator='eq' value='" + servingGroup.ToString() + @"' />
<condition attribute='new_destination' operator='eq' value='" + location.ToString() + @"' />
<condition attribute='statecode' operator='eq' value='0' />
</filter>
<link-entity name='new_yummycontract' from='new_yummycontractid' to='new_contractid' link-type='inner' alias='ad'>
<filter type='and'>
<condition attribute='new_yummycontractid' operator='eq' uiname='" + uiname + @"' uitype='new_yummycontract' value='" + contractId.ToString() + @"' />
</filter>
</link-entity>
</entity>
</fetch>";
EntityCollection results = service.RetrieveMultiple(new FetchExpression(fetchLines));
我用了webutility.htmlencode(uiname)
,问题似乎已经消失了。我猜 uiname 有一些无效的 XML 字符,这个方法解决了这个问题!
uiname
和 uitype
不是您的 fetchXml 工作所必需的。这些用于演示而不用于查询。我认为这些是由高级查找编辑器添加的;因此 "UI"
您可以像这样重写 XML 的那个部分
<link-entity name='new_yummycontract' from='new_yummycontractid' to='new_contractid' link-type='inner' alias='ad'>
<filter type='and'>
<condition attribute='new_yummycontractid' operator='eq' value='" + contractId.ToString() + @"' />
</filter>
</link-entity>
不确定您使用的是哪个版本的 .NET,但您也可以使用 $
特殊字符来指示 interpolated string,我认为这可以提高可读性并减少字符串连接
string fetchLines = @$"
<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='false'>
<entity name='new_yummycontractline'>
<attribute name='new_yummycontractlineid' />
<filter type='and'>
<condition attribute='new_servingtime' operator='eq' value='{servingTime}' />
<condition attribute='new_servinggroup' operator='eq' value='{servingGroup}' />
<condition attribute='new_destination' operator='eq' value='{location}' />
<condition attribute='statecode' operator='eq' value='0' />
</filter>
<link-entity name='new_yummycontract' from='new_yummycontractid' to='new_contractid' link-type='inner' alias='ad'>
<filter type='and'>
<condition attribute='new_yummycontractid' operator='eq' value='{contractId}' />
</filter>
</link-entity>
</entity>
</fetch>";