C#:获取XML文档的所有节点

16

有没有简单的方法可以从XML文档中获取所有节点?我需要每个单独的节点、子节点等等,以便检查它们是否具有某些属性。

或者我必须遍历整个文档,查询子节点吗?


请查看以下链接:http://forums.asp.net/t/1285409.aspx/1 http://www.developerfusion.com/article/4078/reading-storing-and-transforming-xml-data-in-net/5/ http://weblogs.asp.net/karan/archive/2010/04/29/parse-an-xml-file.aspx - Prasanth
如果您需要检查某些属性,您不需要遍历每个节点(文本节点、文档节点、注释节点)。只需遍历每个元素节点或每个属性节点(即使用LINQ或XSLT)。元素节点是唯一具有属性的节点类型。 - Abel
这个文档有多大?是否值得进行优化? - H H
8个回答

27

在LINQ to XML中,这非常容易:

XDocument doc = XDocument.Load("test.xml"); // Or whatever
var allElements = doc.Descendants();

因此,要查找具有特定属性的所有元素,例如:

var matchingElements = doc.Descendants()
                          .Where(x => x.Attribute("foo") != null);

假设你想要所有的元素。如果你想要所有的节点(包括文本节点等,但是不包括属性作为单独的节点),那么你应该使用DescendantNodes()

编辑:在LINQ to XML中,命名空间很方便。你可以使用:

var matchingElements = doc.Descendants()
                          .Where(x => x.Attribute(XNamespace.Xmlns + "aml") != null);

或者针对不同的命名空间:

XNamespace ns = "http://some.namespace.uri";

var matchingElements = doc.Descendants()
                          .Where(x => x.Attribute(ns + "foo") != null);

@Jeff:你是指使用索引器而不是方法调用来获取属性吗?如果是,已经修复了。如果不是,我有点困惑... - Jon Skeet
是的,那就是我想表达的意思。 :) - Jeff Mercado
很好。有点不相关,但我该如何检查具有命名空间的属性名称?例如:xmlns:aml?它说我不能在属性名称中使用冒号。 - Nicolai

7
请看这里:如何遍历XML文件中的所有节点 简而言之:
 string xml = @"
    <parent>
      <child>
        <nested />
      </child>
      <child>
        <other>
        </other>
      </child>
    </parent>
    ";

  XmlReader rdr = XmlReader.Create(new System.IO.StringReader(xml));
  while (rdr.Read())
  {
    if (rdr.NodeType == XmlNodeType.Element)
    {
      Console.WriteLine(rdr.LocalName);
    }
  }

3
与XDocument和其他类似DOM的方法相比,这种方法通常非常快速。 - Abel

7

在我看来,最简单的解决方案是使用 XPath。如果你有 .NET 2,这也可以工作:

var testDoc = new XmlDocument();
testDoc.LoadXml(str);
var tmp = testDoc.SelectNodes("//*"); // match every element

2
按属性名称获取所有节点:var pnNodes = testDoc.SelectNodes("//*[@AttributeName]"); - M. Fawad Surosh

3

1

0
  protected void Page_Load(object sender, EventArgs e)
  {

            XmlDocument document = new XmlDocument();

            string xmlStr;
            using (var wc = new WebClient())
            {
                xmlStr = wc.DownloadString("test.xml");
            }

            var xmlDoc = new XmlDocument();

            xmlDoc.LoadXml(xmlStr);

            XmlNode xnod = xmlDoc.DocumentElement;

           AddWithChildren(xnod, 1);
 }

仅有代码堆积而没有解释很少有帮助。请考虑为您的答案添加一些上下文。 - Chris

0
public void AddWithChildren(XmlNode xnod, Int32 intLevel) //,XmlDocument xmlDoc
    {  
        List<IEnumerable> item = new List<IEnumerable>();
        XmlNode xnodWorking;
        String strIndent = new string('-', 2 * intLevel);
        String strIndent1 = new string('@', 2 * intLevel);
        if (xnod.NodeType == XmlNodeType.Element)
        {
            item.Add(new ListXML(strIndent + xnod.Name, strIndent + xnod.Name, ""));
            XmlNamedNodeMap mapAttributes = xnod.Attributes;
            foreach (XmlNode xnodAttribute in mapAttributes)
            {
                item.Add(new ListXML(strIndent1 + xnodAttribute.Name, strIndent1 + xnodAttribute.Name, ""));
            }
            if (xnod.HasChildNodes)
            {
                xnodWorking = xnod.FirstChild;
                while (xnodWorking != null)
                {
                    AddWithChildren(xnodWorking, intLevel + 1);
                    xnodWorking = xnodWorking.NextSibling;
                }
            }
        }
    }

0
string AttrNameerr = "err";//find error code in xml
XmlReader rdr = XmlReader.Create(new stem.IO.StringReader(somesXMLtring));//somesXMLtring is xml in string variable we want to find attribute in.
while (rdr.Read())
{
    if (rdr.NodeType == XmlNodeType.Element)
    {
      //Found the new element, now check if the required attribute is present or not. if not, ignore, if yes then display the same
      string val = rdr.GetAttribute(AttrNameerr);//AttrNameerr is name of attribute we need to get value of which. here we are searching for error code stored as value of 'err' attribute

        if (val != null)
          textBox.Text = strResult = "error = " + rdr.GetAttribute(AttrNameerr);

    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接