【问题标题】:Fragmented XML string parsing with Linq使用 Linq 解析分段 XML 字符串
【发布时间】:2011-05-26 23:29:44
【问题描述】:

假设我有一个如下的分段 XML。

<A>
  <B></B>
</A>
<A>
  <B></B>
</A>

我可以使用带有片段选项的XmlReader 来解析这个not complete XML 字符串。

XmlReaderSettings settings = new XmlReaderSettings();
settings.ConformanceLevel = ConformanceLevel.Fragment;
XmlReader reader;
using (StringReader stringReader = new StringReader(inputXml))
{
    reader = XmlReader.Create(stringReader, settings);
}
XPathDocument xPathDoc = new XPathDocument(reader);
XPathNavigator rootNode = xPathDoc.CreateNavigator();
XPathNodeIterator pipeUnits = rootNode.SelectChildren("A", string.Empty);
while (pipeUnits.MoveNext())

我可以用 Linq 做这个分段的 XML 字符串解析吗?

【问题讨论】:

  • 你能用虚拟根包裹它吗?

标签: c# .net xml linq


【解决方案1】:

使用XNode.ReadFrom() method,您可以轻松创建一个返回XNodes 序列的方法:

public static IEnumerable<XNode> ParseXml(string xml)
{
    var settings = new XmlReaderSettings
    {
        ConformanceLevel = ConformanceLevel.Fragment,
        IgnoreWhitespace = true
    };

    using (var stringReader = new StringReader(xml))
    using (var xmlReader = XmlReader.Create(stringReader, settings))
    {
        xmlReader.MoveToContent();
        while (xmlReader.ReadState != ReadState.EndOfFile)
        {
            yield return XNode.ReadFrom(xmlReader);
        }
    }
}

【讨论】:

    【解决方案2】:

    我不是这个主题的专家,但我不明白为什么这种方法行不通:

    XDocument doc = XDocument.Parse("<dummy>" + xmlFragment + "</dummy>");
    

    使用这种方法的一件事是您必须记住虚拟节点是文档的根。显然,您总是可以只查询子节点属性来获取您需要的信息。

    【讨论】:

    • JSprang 谢谢你,你是对的。我将编辑我的答案以反映您的评论。
    猜你喜欢
    • 2020-01-27
    • 1970-01-01
    • 1970-01-01
    • 2012-07-17
    • 2012-09-27
    • 2010-12-23
    • 2014-11-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多