【问题标题】:C# : Getting all nodes of XML docC#:获取 XML 文档的所有节点
【发布时间】:2021-02-15 20:17:21
【问题描述】:

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

或者我必须爬过文档,询问子节点吗?

【问题讨论】:

标签: c# xml


【解决方案1】:

在 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:您的意思是使用索引器而不是方法调用来获取属性吗?如果是这样,修复。如果没有,我很困惑......
  • 是的,我就是这个意思。 :)
  • 优秀。升位无关,但我将如何检查名称中有名称空间的属性?喜欢:xmlns:aml?它说我的属性名称中不能有 :'s。
【解决方案2】:

请看这里:Iterating through all nodes in XML file

很快:

 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);
    }
  }

【讨论】:

  • 与 XDocument 和其他类似 DOM 的方法相比,这种方法通常非常非常快。
【解决方案3】:

在我看来,最简单的解决方案是使用 XPath。如果您有 .NET 2,这也适用:

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

【讨论】:

  • 按属性名获取所有节点:var pnNodes = testDoc.SelectNodes("//*[@AttributeName]");
【解决方案4】:

XDocument.Descendants 将返回一个平面枚举中的所有节点。

【讨论】:

    【解决方案5】:

    查看 LINQ to XML。这可以满足您的需求。

    http://www.hookedonlinq.com/LINQtoXML5MinuteOverview.ashx

    例如,您可以使用SelectMany 扩展名。

    但如果您想检查这些值,您可以使用 LINQ 创建where-statements。

    【讨论】:

      【解决方案6】:
      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;
                      }
                  }
              }
          }
      

      【讨论】:

        【解决方案7】:
          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);
         }
        

        【讨论】:

        • 没有解释的代码转储很少有帮助。请考虑在您的答案中添加一些上下文。
        【解决方案8】:
        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);
        
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多