c# - 从混合了 XML 和纯文本的流中读取

标签 c# .net xml stream

我有一个文本流,其中包含任意纯文本和格式正确的 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>

最佳答案

假设这是一个 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);
        }

    }

}

关于c# - 从混合了 XML 和纯文本的流中读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11555534/

相关文章:

c# - asp.net:如何防止用户多次发布相同的数据

c# - 使用 List.Sort(Comparison<T> comparison) 在 C# 中对列表进行排序

c# - C#、.NET 中的 Google Api OAuth

c# - .NET DLL/EXE PE 是否符合要求?

xml - xPath-节点不存在时返回默认值?

c# - 与 ECDsaCng 算法一起使用的 key 必须具有 ECDsa 算法组

c# - 在 ComboBox 的选中项中显示图像

c# - 命名空间更改后的 DataContractSerializer 兼容性

c# - 使用自定义 ItemsSource 刷新 ListBox 的最简单方法?

java - 如何避免 com.thoughtworks.xstream.io.StreamException : Cannot create XmlPullParser while deseriliazation?