2

任意のプレーン テキストと整形式の 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>
4

1 に答える 1

1

これがハックであると仮定すると、混合ドキュメントを「偽の」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);
        }

    }

}
于 2012-07-19T08:23:52.800 に答える