【问题标题】:XmlReader: Not reading sibling child elementsXmlReader:不读取同级子元素
【发布时间】:2017-03-26 10:43:23
【问题描述】:

以下是代码:

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 来实现这一点

【问题讨论】:

    标签: c# xml xmlreader


    【解决方案1】:

    ReadElementContentAsString 读取并将阅读器前进到下一个元素。
    因此,使用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,那就不需要了!!
    • 感谢 Ofir 的 OuterXml 解决方案
    【解决方案2】:

    如果有人想知道如何获取每个子节点的 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();
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2014-05-31
      • 2019-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-30
      • 1970-01-01
      相关资源
      最近更新 更多