C# 使用XMLDocument对象解析值中嵌入双引号的xml属性

C# 使用XMLDocument对象解析值中嵌入双引号的xml属性,c#,xml,regex,C#,Xml,Regex,这是一个网络项目。 我从外部源收到一个部分html字符串。使用XMLDocument解析它可以很好地工作,除非它遇到带有嵌入引号的属性,如下面的“style”属性 <span id="someId" style="font-family:"Calibri", Sans-Serif;">Some Text</span> 一些文本 似乎(但我可能错了)LoadXml()认为Calibri结束style属性之前的双引号是另一个“标记”(标记是我在错误消息中得到的术语) va

这是一个网络项目。 我从外部源收到一个部分html字符串。使用XMLDocument解析它可以很好地工作,除非它遇到带有嵌入引号的属性,如下面的“style”属性

<span id="someId" style="font-family:"Calibri", Sans-Serif;">Some Text</span>
一些文本
似乎(但我可能错了)LoadXml()认为Calibri结束style属性之前的双引号是另一个“标记”(标记是我在错误消息中得到的术语)

var xml=new XmlDocument();

xml.LoadXml();// 那个数据是无效的。带双引号的属性值中不能包含双引号。使用单引号引用的属性的值中不能有单引号

有效期:

<tag attr1="value with 'single' quotes" attr2='value with "double" quotes' />

无效:

<tag attr1="value with "double" quotes" attr2='value with 'single' quotes' />

请注意,可以按如下方式使无效示例有效:

<tag attr1="value with &quot;double&quot; quotes" attr2='value with &apos;single&apos; quotes' />

该数据无效。带双引号的属性值中不能包含双引号。使用单引号引用的属性的值中不能有单引号

有效期:

<tag attr1="value with 'single' quotes" attr2='value with "double" quotes' />

无效:

<tag attr1="value with "double" quotes" attr2='value with 'single' quotes' />

请注意,可以按如下方式使无效示例有效:

<tag attr1="value with &quot;double&quot; quotes" attr2='value with &apos;single&apos; quotes' />


作为补充说明,您应该使用XDocument而不是XmlDocument,因为它在.NET 3.5中已被弃用。您最好让第三方向您发送有效的XML。他们甚至可能没有意识到他们发送的是无效的XML——这可能只是他们代码中的一个bug,或者他们可能不理解XML。如果你能教育他们,他们将是你更好的商业伙伴。与论坛网站不同,我们不使用“感谢”或“感谢任何帮助”或签名。看见“@cubble.Jockey:不,XmlDocument没有被弃用。使用XDocument是值得的,因为它是一个更好的API,但XmlDocument本身仍然很好。@shakyjake:我同意John Saunders的观点:从根本上说,这是无效的XML,你应该让制作人来修复它。生成有效的XML并不难,如果有人未能做到这一点,我会非常紧张:(作为补充说明,您应该使用XDocument而不是XmlDocument,因为它在.NET 3.5中已被弃用。您最好让您的第三方向您发送有效的XML。他们可能甚至没有意识到他们发送的是无效的XML—这可能只是他们的代码中的一个错误,或者他们可能不理解XML。如果您能教育他们,他们将是为您提供更好的业务合作伙伴。与论坛网站不同,我们不使用“感谢”或“感谢任何帮助”或签名。请参阅"@cubble.Jockey:不,XmlDocument没有被弃用。它值得使用XDocument,因为它是一个更好的API,但XmlDocument本身仍然很好。@shakyjake:我同意约翰·桑德斯的观点:从根本上说,这是无效的XML,你应该让生产者来修复它。生成有效的XML并不难,任何失败的人都会让我非常紧张要做到这一点:(可以用
&apos;
举例说明引号/撇号在一个使用相同字符作为开始/结束的属性中是如何编码的?它不在我的控制之下。正如我所说,我从外部来源收到它。@shakyjake:这很有趣。我一直听到这个(“不在我的控制之下,外部来源)。但即使是在“以前”,我们也有一个叫做“编辑”的东西。我们将处理来自“外部来源”的输入数据,可能来自磁带或穿孔卡,数据需要通过某些测试或“编辑”。这个过程的结果将是一盘磁带(或磁盘文件)包含有效数据,并有一份“编辑报告”告知来源任何无效数据。这些年来发生了什么变化,以至于你现在有义务接受垃圾数据?你是奴隶吗?我明白了……奴隶!”回到过去“我做了你提到的所有事情。但是,这件事真的不在我的控制之下,我也无法说服消息来源改变它。我猜我是个奴隶!@shakyjake:注意这个“奴隶”这是一个问题,不是一个陈述。他们所有的文件都有垃圾吗?如果你只是拒绝垃圾,然后告诉他们为什么会发生什么?我的意思是,如果你告诉他们这是垃圾,答案是,好吧,但我们不会修复垃圾,那是一件事。害怕告诉他们这是垃圾是另一件事。可能给他们一个建议n例如,
&apos;
如何在使用相同字符作为开始/结束的属性中对引号/撇号进行编码?它不在我的控制之下。正如我所说,我从外部来源收到它。@shakyjake:这很有趣。我一直听到这句话(“不在我的控制之下,外部来源”)。但即使是这样”回到那个时代,我们有一个叫做“编辑”的东西。我们将处理来自“外部来源”的输入数据,可能来自磁带或穿孔卡片,数据需要通过某些测试或“编辑”。这个过程的结果将是一个包含有效数据的磁带(或磁盘文件)和一个“编辑报告”“告诉来源任何无效数据。这些年来发生了什么变化,以至于你现在有义务接受垃圾数据?你是奴隶吗?我明白了……奴隶!”回到过去我做了你提到的所有事情。但是,这件事真的不在我的控制之下,我也无法说服消息来源改变它。我猜我是个奴隶!@shakyjake:注意“奴隶”这是一个问题,不是一个陈述。他们所有的文件都有垃圾吗?如果你只是拒绝垃圾,然后告诉他们为什么会发生什么?我的意思是,如果你告诉他们这是垃圾,答案是,好吧,但我们不会修复垃圾,那是一回事。害怕告诉他们这是垃圾是另一回事。