XMLReader:如果另一个子节点包含特殊字符串,则获取子节点的值
XMLReader: Get value of child node if another child node contains a special string
我有一个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()
一次。
当 reader 指向 child 文本节点而不是指向 parent 时使用 subreader.Value
元素节点。如果元素没有子元素,您还可以使用 ReadInnerXml()
获取元素节点的文本值,例如:
if (subreader.Name == "cKey" && subreader.ReadInnerXml() == "findMe")
{
subreader.ReadToNextSibling("cValue");
Console.WriteLine ("found: {0}", subreader.ReadInnerXml());
//output:
//found: value
}
我有一个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()
一次。
当 reader 指向 child 文本节点而不是指向 parent 时使用 subreader.Value
元素节点。如果元素没有子元素,您还可以使用 ReadInnerXml()
获取元素节点的文本值,例如:
if (subreader.Name == "cKey" && subreader.ReadInnerXml() == "findMe")
{
subreader.ReadToNextSibling("cValue");
Console.WriteLine ("found: {0}", subreader.ReadInnerXml());
//output:
//found: value
}