【问题标题】:Reading from a stream with mixed XML and plain text从混合 XML 和纯文本的流中读取
【发布时间】:2012-07-19 07:03:31
【问题描述】:

我有一个文本流,其中包含任意纯文本和格式良好的 xml 元素的片段。如何阅读它并仅提取 xml 元素? ConformanceLevel 设置为 Fragment 的 XmlReader 在遇到纯文本时仍会引发异常,对于它来说这是格式错误的 xml。

有什么想法吗?谢谢

到目前为止,这是我的代码:

XmlReaderSettings settings = new XmlReaderSettings();
settings.ConformanceLevel = ConformanceLevel.Fragment;

using (XmlReader reader = XmlReader.Create(stream, settings))
    while (!reader.EOF)
    {
        reader.MoveToContent();
        XmlDocument doc = new XmlDocument();
        doc.Load(reader.ReadSubtree());
        reader.ReadEndElement();
    }

这是一个示例流内容,顺便说一下,我无法控制它:

Found two objects:
Object a
<object>
    <name>a</name>
    <description></description>
</object>
Object b
<object>
    <name>b</name>
    <description></description>
</object>

【问题讨论】:

  • 这不是 XML,如果你有纯文本的话。不要尝试将其解析为 Xml。您能否更准确地描述源的格式是什么?也许 HtmlAgilityPack 可以帮助你,它可以解析 Html,它是节点和纯文本的混合。
  • 我知道不是,否则这会容易得多!我添加了一个示例流内容(不知道如何在这里关闭颜色突出显示.. 抱歉)
  • 对于语法高亮,您可以使用&lt;!-- language: lang-html --&gt; 强制语言(请参阅帮助更多信息)。关于源流,您应该尝试 HtmlAgility 包。或者您是否有可靠的方法来了解什么是纯文本和什么是 xml(类似于已知模式:1 个文本、1 个 xml 节点、1 个文本、1 个 xml 节点等)
  • 只需将整个内容包含在标签中,它就是 xml。引用 W3C XML 1.0 “当该类型的元素可能包含字符数据时,该元素类型具有混合内容,可选地穿插有子元素。”

标签: c# .net xml stream


【解决方案1】:

如果这是一个 hack,如果你用“假”xml 根节点包装你的混合文档,你应该能够做你需要的事情,只获取元素类型的节点(即跳过文本节点)根元素的子元素:

using System;
using System.Linq;
using System.Xml;

static class Program {

    static void Main(string[] args) {

        string mixed = @"
Found two objects:
Object a
<object>
    <name>a</name>
    <description></description>
</object>
Object b
<object>
    <name>b</name>
    <description></description>
</object>
";
        string xml = "<FOO>" + mixed + "</FOO>";
        XmlDocument doc = new XmlDocument();
        doc.LoadXml(xml);
        var xmlFragments = from XmlNode node in doc.FirstChild.ChildNodes 
                           where node.NodeType == XmlNodeType.Element 
                           select node;
        foreach (var fragment in xmlFragments) {
            Console.WriteLine(fragment.OuterXml);
        }

    }

}

【讨论】:

  • 太棒了!奇迹般有效。非常感谢。
  • 很高兴它有所帮助,即使我不能保证它不会因输入略有不同而爆炸:)
猜你喜欢
  • 2014-08-10
  • 1970-01-01
  • 1970-01-01
  • 2020-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-08
相关资源
最近更新 更多