XmlReader:不读取同级子元素

XmlReader: Not reading sibling child elements

代码如下:

string str = "<A><B>Apple</B><B>Mango</B></A>";

using (XmlReader xmlReader = XmlReader.Create(new StringReader(str)))
{
    while (xmlReader.Read())
    {
        if (xmlReader.NodeType == XmlNodeType.Element && xmlReader.Name == "B")
        {
            Console.WriteLine(xmlReader.ReadElementContentAsString());
        }
    }
}

输出:

苹果

假设输出:

苹果
芒格洛

你能帮我理解这段代码有什么问题吗?我如何获得预期的输出?

注意:我想用 XmlReader 实现这个

ReadElementContentAsString 读取 reader 并将其前进到下一个元素。
因此,对于 while 中的 Read,您将跳过下一个 B 元素。

而是使用 Value 属性.

using (XmlReader xmlReader = XmlReader.Create(new StringReader(str)))
{
    while (xmlReader.Read())
    {
        if (xmlReader.NodeType == XmlNodeType.Element && xmlReader.Name == "B")
        {
            xmlReader.Read(); // Next read will contain the value
            Console.WriteLine(xmlReader.Value);
        }
    }
}

如果你想显示外层 xml 则使用方式稍有不同:

bool hasMore = xmlReader.Read();
while (hasMore)
{
    if (xmlReader.NodeType == XmlNodeType.Element && xmlReader.Name == "B")
    {
        Console.WriteLine(xmlReader.ReadOuterXml());
    }
    else hasMore = xmlReader.Read();
}

如果有人想知道如何获取每个子节点的 OuterXml 以及如何使用子节点值,可以使用以下代码:

string str = "<A><B>Apple</B><B>Mango</B></A>";

using (XmlReader xmlReader = XmlReader.Create(new StringReader(str)))
{
    while (!xmlReader.EOF)
    {
        if (xmlReader.NodeType == XmlNodeType.Element && xmlReader.Name == "B")
        {
            XElement xElement = XNode.ReadFrom(xmlReader) as XElement;
            Console.WriteLine(xElement.ToString());     // This will print the tag
            Console.WriteLine(xElement.Value);          // This will print the tag value
        }
        else
        {
            xmlReader.Read();
        }
    }
}