如何读取具有与其祖先同名的子项的XML文件?

时间:2011-08-09 01:40:44

标签: c# xml

我无法在C#Visual web dev 2010上阅读以下XML文件。 如您所见,Category可以是child的名称以及parent。 当我尝试xmldataset.ReadXml时,它会出现一个错误,表示表类别不能是它自己的孩子。

还有其他方法可以阅读这种XML。

我们非常感谢快速的样本指南。

<Categories>
  <Category id="10000000">
    <name>Clothing</name>
    <Children>
      <Category id="10010000">
        <name>Handbags & Luggage</name>
        <Children>
          <Category id="10010800">
            <name>Travel Accessories</name>
          </Category>
        </Children>
      </Category>
    </Children>
  </Category>
</Categories>

4 个答案:

答案 0 :(得分:1)

我认为xpath会给你你想要的东西。

XmlNodeList nodes = myXmlDoc.SelectNodes("//name");

“//”应该返回xml文档中所有<name>个节点。 然后,您可以使用<name>节点列表执行任何操作。例如

foreach (XmlNode node in nodes)
{
    console.WriteLine(node.InnerText);
}

答案 1 :(得分:0)

如果您只想要数组中的名称字段,请尝试以下代码。可能存在轻微的语法错误!

XmlDocument xd;
XmlNodeList xnl;
int i;
string[] s;

xd = new XmlDocument();
xd.Load(xmlFileName);
xnl = xd.SelectNodes("//Category/name");
i = 0;
s = new string[xnl.Count];
foreach(XmlNode xn in xnl)
{
    // xn will be an object of type XmlElement,
    // which exposes the value of the text it contains through the InnerText property
    s[i++] = xn.InnerText;
}

// an array of strings named 's' is available at this point.
// NB: I have omitted all manner of error checking here for clarity of code.

更新:我没有正确阅读您的示例XML。我一直在指定错误的XML路径。我指的是阅读<Category name="Blah">...</Category>的路径,而您的示例有<Category><name>Blah></name>...</Category>。道歉。

请参阅我对您自己的解决方案的评论,尽管公平地说,使用XmlReader将比使用XmlDocument快得多。

答案 2 :(得分:0)

对于那些想要了解的人,

我把它整理出来了:

 XmlTextReader xr = new XmlTextReader("test.xml");

            int i=0;
            string[] ss; 
            while (xr.Read())
            {
                Console.Write(xr.Name);
                if (xr.Name.ToString() == "name") { ss[i] = xr.ReadString(); i++ };
            }

答案 3 :(得分:0)

使用LINQ To XML以下代码

XDocument xmlDoc = XDocument.Load(new StringReader(@"<Categories>
  <Category id='10000000'>
    <name>Clothing</name>
    <Children>
      <Category id='10010000'>
        <name>Handbags &amp; Luggage</name>
        <Children>
          <Category id='10010800'>
            <name>Travel Accessories</name>
          </Category>
        </Children>
      </Category>
    </Children>
  </Category>
</Categories>
"));

var names = xmlDoc.Root.Descendants("name")
        .Select(n => n.Value).ToList();

names.ForEach(n => Console.WriteLine(n));

输出

Clothing
Handbags & Luggage
Travel Accessories

使用LINQPad进行了测试。