【问题标题】:Parsing xml attributes with embedded double-quotes in their values using XMLDocument object使用 XMLDocument 对象解析在其值中嵌入双引号的 xml 属性
【发布时间】:2014-09-08 20:43:07
【问题描述】:

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

<span id="someId" style="font-family:"Calibri", Sans-Serif;">Some Text</span>

似乎(但我可能错了)LoadXml() 认为 Calibri 之前的双引号结束了样式属性,并且 Calibri 是另一个“令牌”(令牌是我在错误消息中得到的术语) .

var xml = new XmlDocument();
xml.LoadXml(<the html string above, properly escaped>); // <--- here is where I get the error message below

"'Calibri' is an unexpected token. Expecting white space. Line 1, position 18."

我可以使用正则表达式来替换内引号,但它会相当难看。而且,我很可能最终会这样做!

我认为也许 HtmlAgilityPack 会有所帮助,但我找不到关于它的好的文档,我宁愿避免使用文档稀疏的 3rd 方库。

有没有办法让 LoadXml() 接受它(然后,让 Attributes 集合正确解析它)?我对此没有太大希望,但无论如何我都会把它扔在那里。或者我应该完全使用 XmlDocument 以外的另一个类?我愿意使用具有良好文档的 3rd 方库。

【问题讨论】:

  • 附带说明,您应该使用 XDocument 而不是 XmlDocument,因为它在 .NET 3.5 中已被弃用
  • 您最好让第三方向您发送有效的 XML。他们甚至可能不知道他们正在发送无效的 XML - 这可能只是他们的代码中的一个错误,或者他们可能不理解 XML。如果您可以教育他们,他们将成为您更好的商业伙伴。
  • 与论坛网站不同,我们不使用“谢谢”、“任何帮助表示赞赏”或Stack Overflow 上的签名。请参阅“Should 'Hi', 'thanks,' taglines, and salutations be removed from posts?.
  • @Cubicle.Jockey:不,XmlDocument 没有被弃用。值得使用 XDocument 仅仅是因为它是一个更好的 API,但 XmlDocument 本身仍然很好。
  • @shakyjake:我同意 John Saunders 的观​​点:从根本上说这是无效的 XML,您应该让生产者修复它。生成有效的 XML 并不难,我会为任何未能做到这一点的人感到非常紧张:(

标签: c# xml regex


【解决方案1】:

该数据无效。用双引号引起来的属性不能在属性值中包含双引号。用单引号括起来的属性不能在值中包含单引号。

有效:

<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' />

【讨论】:

  • 可以举一个&amp;quot;&amp;apos; 的例子,说明引号/撇号将如何在使用与开始/结束相同的字符的属性中进行编码?
  • 它不在我的控制之下。正如我所说,我从外部来源收到此信息。
  • @shakyjake:这很有趣。我一直听到这个(“不在我的控制之下,外部来源”)。但即使是“回到过去”,我们也有一个叫做“编辑”的东西。我们将处理来自“外部来源”的输入数据,可能来自磁带或穿孔卡片,并且这些数据需要通过某些测试或“编辑”。这个过程的结果将是一个包含有效数据的磁带(或者可能是磁盘文件),以及一个告诉源任何无效数据的“编辑报告”。多年来发生了什么变化,以至于您现在有义务接受垃圾数据?你是奴隶吗?
  • 我明白了……一个奴隶! “回到过去”我做了你提到的所有事情。但是,这个确实不是我能控制的,我也无法说服源头改变它。我想我是个奴隶!
  • @shakyjake:请注意,“奴隶”是一个问题,而不是一个陈述。他们所有的文件中都有这些垃圾吗?如果你只是拒绝垃圾会发生什么,然后告诉他们为什么?我的意思是,如果你告诉他们这是垃圾,答案是,好吧,但是我们不会修复垃圾,那是一回事。不敢告诉他们这是垃圾,这与另一件事很接近。
猜你喜欢
  • 2014-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多