【问题标题】:Cant get list from received XML file无法从收到的 XML 文件中获取列表
【发布时间】:2013-08-14 18:47:27
【问题描述】:

这是我收到的 xml:

<?xml version="1.0" encoding="UTF-8"?>
<mdpr:Data xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mdpr="http://...">
<mdpr:contactList>
    <mdpr:contact ID="{123456}" classID="Customer">
      <mdpr:Name>data1</mdpr:Name>
      <mdpr:TransportCode>data2</mdpr:TransportCode>
      <mdpr:ZipCode>data3</mdpr:ZipCode>
      <mdpr:City>data4</mdpr:City>
    </mdpr:contact>
    <mdpr:contact ID="{234567}" classID="Customer">
      <mdpr:Name>data5</mdpr:Name>
      <mdpr:TransportCode>data6</mdpr:TransportCode>
      <mdpr:ZipCode>data7</mdpr:ZipCode>
      <mdpr:City>data8</mdpr:City>
    </mdpr:contact>
</mdpr:contactList>
...

这是我尝试获取所有联系人的方法:

public class Contact
    {
        public string Name { get; set; }
        public string TransportCode { get; set; }
    }
...
XDocument xdoc = XDocument.Load(doc.CreateNavigator().ReadSubtree());

            List<Contact> contacts = (from xml in xdoc.Elements("contactList").Elements("contact")
                                      select new Contact
                              {
                                  Name = xml.Element("Name").Value,
                                  TransportCode = xml.Element("TransportCode").Value
                              }).ToList();

但我什么也得不到。我在这里做错了什么?

【问题讨论】:

  • 您的文档真的使用http://... 作为 mdpr 命名空间吗? (问题在于您的命名空间处理。)

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


【解决方案1】:

您的 xml 中声明了 mdpr 命名空间:

xmlns:mdpr="http://..."

但您只提供查询中元素的本地名称。例如。您提供contactList 名称,但元素的全名是mdpr:contactList。所以什么也没找到。

您应该为您的命名空间定义XNamespace 并使用它来创建元素的全名:

XNamespace mdpr = "http://...";
var contacts = from c in xdoc.Root.Element(mdpr + "contactList")
                                  .Elements(mdpr + "contact")
               select new Contact {
                   TransportCode = (string)c.Element(mdpr + "TransportCode"),
                   Name = (string)c.Element(mdpr + "Name")
               };

另外contactList 不是文档的根。您应该在Root 下搜索它。

【讨论】:

    【解决方案2】:
    XDocument xdoc = XDocument.Load(doc.CreateNavigator().ReadSubtree());
    var ns = xdoc.Root.Name.Namespace;
    List<Contact> contacts = (from xml in xdoc.Root.Elements(ns +"contactList").Elements(ns +"contact")
                              select new Contact
                      {
                          Name = xml.Element(ns +"Name").Value,
                          TransportCode = xml.Element(ns +"TransportCode").Value
                      }).ToList();  
    

    【讨论】:

      【解决方案3】:

      尝试指定命名空间

      string nmsp = "http://www.w3.org/2001/XMLSchema-instance/"
      
      from xml in xdoc.Elements(nmsp+"contactList").Elements(nmsp + "contact")
      

      【讨论】:

        猜你喜欢
        • 2011-08-16
        • 1970-01-01
        • 1970-01-01
        • 2016-12-05
        • 2021-06-06
        • 2014-05-15
        • 1970-01-01
        • 1970-01-01
        • 2016-10-19
        相关资源
        最近更新 更多