【问题标题】:How do I match complete XML objects in a string?如何匹配字符串中的完整 XML 对象?
【发布时间】:2010-05-27 17:55:35
【问题描述】:

我正在尝试在字符串中查找完整的 XML 对象。它们已由XmlSerializer 放置在字符串中,但可能不完整。我玩弄了使用正则表达式的想法,因为它看起来像是它们的构建目的,除了我正在尝试解析 XML 的事实。

我正在尝试在表单中找到完整的对象:

<?xml version="1.0"?>
<type>
    <field>value</field>
    ...
</type>

我的想法是用正则表达式来查找&lt;?xml version="1.0"?&gt;&lt;type&gt;&lt;/type&gt;,但是如果一个字段与type 同名,它显然是行不通的。

有很多关于 XML 解析器的文档,但它们似乎都需要一个完整的、格式完整的文档来解析。我的 XML 对象可以放在一个几乎被其他任何东西(包括其他完整对象)包围的字符串中。

hw<e>reR@lot$0fr@ndm&nchrs%<?xml version="1.0"?><type><field>...</field>...</type>@ndH#r$omOre!!>nuT6erjc?y!<?xml version="1.0"?><type><field>...</field>...</type>ty!=]

正则表达式能够匹配字符串,同时排除随机字符,但找不到 complete XML 对象。我想要一些方法来提取一个对象,用序列化器解析它,然后重复直到字符串不再包含有效对象。

【问题讨论】:

  • 强制不要使用正则表达式解析 XML 链接:stackoverflow.com/questions/1732348/…
  • 是的,我偶然发现了这一点。我正在寻找替代方案,但我需要匹配,而正则表达式是最好的解释方式。

标签: c# xml regex xml-serialization


【解决方案1】:

您能否使用正则表达式搜索“&lt;?xml”片段,然后假设它是 XML 对象的开头,然后使用 XMLReader 读取/检查字符串的其余部分,直到您解析了一个完整的元素在根级别(然后在根节点完全解析后停止使用 XMLReader 从流中读取)?

编辑:有关使用 XMLReader 的更多信息,我建议我提出的问题之一:I can never predict xmlreader behavior, any tips on understanding?

我的最终解决方案是在解析 XML 时坚持使用“Read”方法,并避免从流中实际读取的其他方法推进当前位置。

【讨论】:

  • 这可能是要走的路……不过,我不完全确定如何使用 XmlReader。我正在阅读它,但是您有什么有用的建议吗?
  • 是的,我在弄清楚如何正确使用 XMLReader 时遇到了一些麻烦,所以我在这里提出了一些问题,但我现在对它相当满意。我编辑了答案以添加指向该问题的链接。
【解决方案2】:

您可以尝试使用Html Agility Pack,它可用于解析“格式错误的 XML”并使其可通过 DOM 访问。

有必要知道您正在寻找哪个元素(例如您的示例中的&lt;type&gt;),因为它也会解析意外元素(例如您的示例中的&lt;e&gt;)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-02
    • 1970-01-01
    • 2017-05-26
    • 1970-01-01
    相关资源
    最近更新 更多