XMLReader读取未知类型的下一个兄弟

时间:2018-05-08 17:57:08

标签: c# xmlreader

我理解我们如何使用如下代码示例..

public class Sample
{
    public static void Main()
    {
        using (XmlReader reader = XmlReader.Create("books.xml"))
        {
            reader.ReadToFollowing("book");
            do
            {
                Console.WriteLine("Name ", reader.GetAttribute("Name"));
            } while (reader.ReadToNextSibling("book"));
        }
    }
}

这将读取“book”类型的每个兄弟。所以在像下面这样的xml结构中它会很好用..

<Section>
       <book Name="Titan Quest 1"/>
       <book Name="Titan Quest 2"/>
       <book Name="Adventure Willy"/>
       <book Name="Mr. G and the Sandman"/>
       <book Name="Terry and Me"/>
</Section>

但是,让我们说你的兄弟姐妹并不总是类型书..在内部,我们可以有书,CD,DVD或vhs所以xml可能看起来像这样

<Section>
       <cd Name="Titan Quest 1"/>
       <book Name="Titan Quest 2"/>
       <vhs Name="Adventure Willy"/>
       <cd Name="Mr. G and the Sandman"/>
       <dvd Name="Terry and Me"/>
</Section>

我想写一个方法,它会给我Name属性,不管它是什么兄弟类型。使用上面的代码我只会得到[Titan Quest 2]。可以这样做吗?谢谢!

2 个答案:

答案 0 :(得分:2)

将此代码与XDocument一起使用将获得属性中的所有值:

 var document = XDocument.Load("test.xml");

 var bookValues = document.XPathSelectElement("Section")
       .Descendants()
       .Select(x => x.Attribute("Name").Value);

或使用XmlReader获取所有属性值:

List<String> values = new List<string>();
using (var xmlreader = XmlReader.Create("test.xml"))
{
    xmlreader.ReadToDescendant("Section");
    while (xmlreader.Read())
    {
        if (xmlreader.IsStartElement())
        {
            values.Add(xmlreader.GetAttribute("Name"));
        }
    }
}

答案 1 :(得分:1)

尝试以下代码。将适用于两种类型的书籍。我使用了xmlreader和XElement的组合:

这是我的xml

python3.6 -m pip install -U virtualenv

这是代码

<test>
   <Section>
       <book Name="Titan Quest 1"/>
       <book Name="Titan Quest 2"/>
       <book Name="Adventure Willy"/>
       <book Name="Mr. G and the Sandman"/>
       <book Name="Terry and Me"/>
   </Section>
   <Section>
       <cd Name="Titan Quest 1"/>
       <book Name="Titan Quest 2"/>
       <vhs Name="Adventure Willy"/>
       <cd Name="Mr. G and the Sandman"/>
       <dvd Name="Terry and Me"/>
   </Section>
</test>

以下是结果

enter image description here