XMLReader:如果另一个子节点包含特殊字符串,则获取子节点的值

时间:2015-05-07 08:06:14

标签: c# xml xmlreader

我有一个XML结构(只是一个片段),如下所示:

<ttOutput>
    <ttOutputRow>
       <cKey>key</cKey>
       <cValue>value</cValue>
    </ttOutputRow>
    <ttOutputRow>
       <cKey>findMe</cKey>
       <cValue>value</cValue>
    </ttOutputRow>
    <ttOutputRow>
       <cKey>key</cKey>
       <cValue>value</cValue>
     </ttOutputRow>
</ttOutput>

为此,我想使用XMLReader来保持低内存。如果 cKey findMe ,我正在寻找 cValue 。我怎样才能得到这个值?

这就是我的尝试:

using (var stream = new StreamReader(path))
using (XmlReader reader = XmlReader.Create(stream))
{
    while(reader.Read())
    {
        if (reader.IsStartElement())
        {
            Console.WriteLine (reader.Name);
            if (reader.Name == "ttOutputRow") {
                XmlReader subreader = reader.ReadSubtree ();
                while (subreader.Read ()) {
                    if (subreader.Name == "cKey" && subreader.Value == "findMe") {
                        subreader.ReadToNextSibling ("cValue");
                        Console.WriteLine ("found");
                    }
                }
            }
        }
    }
}

也许我可以在这里使用ReadToDescendant(String)ReadSubtree(),但我不知道如何正确使用它。

修改

这似乎是使用ReadToDescendant的另一种选择:

while(reader.Read())
{
    reader.ReadToFollowing ("ttOutputRow");
    do {
        if (reader.ReadToDescendant ("cKey")) {
            if (reader.ReadInnerXml() == "findMe") {
                reader.ReadToNextSibling ("cValue");
                Console.WriteLine ("found");
            }
        }
    } while (reader.ReadToFollowing ("ttOutputRow"));
}

我还发现你一次只能使用ReadInnerXml()

1 个答案:

答案 0 :(得分:1)

当阅读器指向文本节点而不是指向元素节点时,请使用subreader.Value。如果元素没有子元素,您还可以使用ReadInnerXml()获取元素节点的文本值,例如:

if (subreader.Name == "cKey" && subreader.ReadInnerXml() == "findMe") 
{
    subreader.ReadToNextSibling("cValue");
    Console.WriteLine ("found: {0}", subreader.ReadInnerXml());
    //output:
    //found: value
}