我有一个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()
。
答案 0 :(得分:1)
当阅读器指向子文本节点而不是指向父元素节点时,请使用subreader.Value
。如果元素没有子元素,您还可以使用ReadInnerXml()
获取元素节点的文本值,例如:
if (subreader.Name == "cKey" && subreader.ReadInnerXml() == "findMe")
{
subreader.ReadToNextSibling("cValue");
Console.WriteLine ("found: {0}", subreader.ReadInnerXml());
//output:
//found: value
}