【问题标题】:Parsing XML-ish data解析 XML-ish 数据
【发布时间】:2011-07-19 09:44:43
【问题描述】:

是的,我真的要问一下关于用正则表达式解析 XML 的问题……就这样吧。

我有一些类似 XML 的数据,我需要解析它。我不能用 XMLDocument 或类似的东西完全做到这一点,因为它不是正确的 XML,而且我不确定我是否可以(或想要)更改格式。主要问题是标签有特殊含义,看起来像这样:

<$ something_here $>

C# 的 XmlDocument 无法解析它,我认为其他方法也会如此。经过大量工作,我可以将上面的内容更改为类似

<some_special_tag><![CDATA[ something_here ]]></some_special_tag>

但这很丑,我也不想这么做。更改会很耗时的原因是我有数百甚至数千个 XML 文档需要更改。

目前,我正在使用正则表达式解析文档。我只需要挑选几个特定的​​标签(不是上面的标签),它似乎可以工作,但我对此感到不舒服。我现在正在做这样的事情:

...

MatchCollection mc = Regex.Matches(Template, "<tagname.*?/tagname>"); // or similar
foreach (Match m in mc) {

    try {

        XmlDocument xd = new XmlDocument();
        xd.LoadXml(m.Value);

...

这至少意味着我没有专门使用正则表达式:)

谁能想到更好的方法?有什么方法可以让 XmlDocument 礼貌地忽略导致它倒下的 $ 字符吗?这似乎不太可能,但我认为我至少应该得到一些意见。

【问题讨论】:

    标签: c# xml regex parsing


    【解决方案1】:

    不,没有办法让XmlDocument 解析不是 xml 的文档,无论它看起来多么接近 xml!

    如果可能的话,我会肯定建议您将文档转换为实际的 xml(或至少一些公认的文档格式)。尝试为任何格式创建和维护一个可靠的工作解析器是一项相当多的工作,更不用说似乎没有严格定义的格式了。

    使用some_special_tag 元素来识别特殊部分对我来说似乎是个好主意。如有必要,您可以使用不同的命名空间来确保不会与文档中的其他元素发生冲突——这实际上正是 xslt 的工作方式(“特殊”标签用于表示特殊事物,例如应替换的模板或节点)以及 xml 旨在支持什么。

    另外,我不明白您为什么需要将 something_here 位放在 CDATA 部分中。所有“破坏” xml 的字符都可以很容易地转义(例如,将&amp;lt; 写为&amp;lt;)。 CDATA 部分通常仅在节点的内容需要大量转义以使其更容易且不那么混乱时使用 CDATA 部分来代替。

    更新:关于迁移到新格式,你不能同时使用这两种方法吗?尝试将文档解析为 XML 文档(或者如果存在性能问题,则执行一些其他测试以快速确定文档是“旧”还是“新”格式,例如检查根元素中的版本属性) - 如果它不起作用,则回退到旧方法。

    这样,只要一切正常(只要没有任何变化),用户就不需要修改他们的文档,但是如果他们遇到问题或想要使用任何新功能,请向他们解释他们必须将其文档更新为新格式。

    根据您当前的“解析器”的工作情况,您甚至可以提供一个升级实用程序来自动执行转换(尽其所能)。

    【讨论】:

    • 我同意,为特殊目的添加特殊标签显然是解析方面的最佳选择,并且将来能够继续解析xml文档。我只是非常希望我不必让我的用户更改他们的文档,并记住以新的方式编写未来的文档......关于 CDATA,确实可能涉及很多转义,因为“ special" 位可能很长,甚至可能是文档的大部分内容。
    • @Neil 您不能通过提供现有方法作为后备方法进行迁移吗?查看我的更新了解更多详情。
    • 我没想到。听起来它会很好用。
    【解决方案2】:

    您不能在运行时将&lt;$ something_here $&gt; 替换为那个大的CDATA 部分,然后像往常一样加载XML 文档吗?

    【讨论】:

      猜你喜欢
      • 2015-02-16
      • 2015-07-12
      • 1970-01-01
      • 2020-06-03
      • 2013-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多