如何从XmlDocument逐个元素获取

时间:2015-10-29 15:06:34

标签: c# xml xml-parsing linq-to-xml

我能够从这个列表中获取我的第一个元素

 <?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <soap:Body>
    <GetITARListResponse xmlns="http://tempuri.org/">
      <GetITARListResult>
        <ClassificationCode>
          <code>dsd</code>
          <description>toto</description>
          <legislation>d/legislation>
        </ClassificationCode>
        <ClassificationCode>
          <code>dsd</code>
          <description>tata</description>
          <legislation>dsd</legislation>
        </ClassificationCode>
        <ClassificationCode>
          <code>code2</code>
          <description>dsds</description>
          <legislation>dsd</legislation>
        </ClassificationCode>

写作

XDocument result = new XDocument();
result  =   ExportControl.ResultXML;
var codes = HttpContext.Current.Server.MapPath("~/XML_Templates/codes.xml");
dynamic root = new ExpandoObject();
XmlToDynamic.Parse(root, xDoc.Elements().First());
var result = xDoc.Descendants(XNamespace.Get("http://tempuri.org/") + "code").First();

获取第一个代码“dsd”。但是,如果我想要一个foreach并获得所有代码呢?或者,如果我想要某个代码怎么办?例如

var result = xDoc.Descendants(XNamespace.Get("http://tempuri.org/") + "code")[2]

2 个答案:

答案 0 :(得分:1)

.Net框架提供了一组可用于移动XML文件的工具:

  1. XmlReader :此类以分层方式读取xml文件,仅转发 没有缓存。
  2. XmlWriter :此类仅在xml文件中向前写入而没有 缓存。
  3. XmlDocument :它可以帮助您按原样导航和编辑小文档 比XmlReader / Writer慢。它使用XmlNode对象在文档中移动并执行更改(属性)。编辑后你可以保存。一种很好的导航方式是使用XPath (xml的查询语言)。
  4. XPathNvigator :class提供了一种浏览XML文档的简便方法。
  5. 在你的情况下,我的建议是实现一个迭代方法和一个分别用XmlReader和XPath定位特定节点的方法。

    更新:XML示例在这里格式不正确:

    <legislation>d/legislation>
    

    这显示了一个读取文件的示例:

    using System;
    using System.Xml;
    
    namespace XMLTest
    {
        class Program
        {
            static void Main(string[] args)
            {
                string xml = @"<?xml version=""1.0"" encoding=""utf-8"" ?>
                                <soap:Envelope xmlns:soap=""http://schemas.xmlsoap.org/soap/envelope/"" xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema"">
                                  <soap:Body>
                                    <GetITARListResponse xmlns=""http://tempuri.org/"">
                                      <GetITARListResult>
                                        <ClassificationCode>
                                          <code>dsd</code>
                                          <description>toto</description>
                                          <legislation>d</legislation>
                                        </ClassificationCode>
                                        <ClassificationCode>
                                          <code>dsd</code>
                                          <description>tata</description>
                                          <legislation>dsd</legislation>
                                        </ClassificationCode>
                                        <ClassificationCode>
                                          <code>code2</code>
                                          <description>dsds</description>
                                          <legislation>dsd</legislation>
                                        </ClassificationCode>
                                      </GetITARListResult>
                                    </GetITARListResponse>
                                  </soap:Body>
                                </soap:Envelope>";
    
                XmlDocument doc = new XmlDocument();
                doc.LoadXml(xml);
    
                var items = doc.GetElementsByTagName("ClassificationCode");
    
                foreach (var item in items)
                {
                    Console.WriteLine(((System.Xml.XmlElement)(item)).InnerText.ToString());
                }
                Console.ReadLine();
            }
        }
    }
    // OUTPUT
    // dsdtotod
    // dsdtatadsd
    // code2dsdsdsd
    

答案 1 :(得分:1)

您的代码示例仅返回First项,因为您正在调用First()方法。为了遍历所有代码,您可以跳过该呼叫,您将获得IEnumerable。然后你可以像这样循环:

var codes = result.Descendants(XNamespace.Get("http://tempuri.org/") + "code");

foreach (var codeElement in codes)
{
    Console.WriteLine(codeElement.Value);
}
// prints:
// dsd
// dsd
// code2

要通过索引访问它们,您可以像这样使用ElementAt:

var someCode = codes.ElementAt(1);
Console.WriteLine(someCode.Value);  // prints dsd

或者您可以按名称进行过滤:

var code2 = codes.Where(c => c.Value == "code2").First();
Console.WriteLine(code2.Value); // prints code2