使用Linq进行XML字符串碎片解析



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

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

我可以使用XmlReader with Fragment选项来解析这个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字符串解析吗?

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

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);
        }
    }
}

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

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

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

最新更新