我有一个xml字符串列表,需要解析这些字符串并将其加载到c#类中。我得到了空引用异常,并认为它的“根”原因是xml中使用的命名空间。我对xml不是很熟悉,所以如果这个解决方案看起来很糟糕,请提供替代方案。
下面是解析代码:
XNamespace ns = "http://www.example.com/schema/msc/message";
XNamespace ns2 = "http://www.example.com/schema/msc/referral";
// data is List<string>
Parallel.ForEach(data, item =>
{
   var root = XElement.Parse(item);
   var dto = new DTO
       {
         RoutingCode = (string)root.Element("Message")
               .Element(ns + "Params")
               .Element(ns + "Events")
               .Attribute("Code")
         User = new UserDTO
                    {
                     AccountName = (string)root.Element("Message")
                                  .Element("Params")
                                  .Element("Events")
                                  .Element("ref:User")
                                  .Element("Name")
                    }
       };
     list.Add(dto);
});下面是一个示例xml元素(减小了可读性)
<Message xmlns="http://www.example.com/schema/msc/message">
  <Params> 
    <Events xmlns="http://www.example.com/schema/msc/referral" Code="AC">
      <ref:User xmlns:ref="http://www.example.com/schema/msc/referral" Name="asdf"/>
    </Events>
  </Parama>
</Message>发布于 2015-11-10 22:35:27
这里有几件事。
XElement.Parse。这意味着在您的示例中,root是Message,并且不会有该名称的子元素。UserDTO。例如,名称应该是ns + Params和ns2 + User。我想提出的另一个建议是,不要过早地离开这一家。使用返回IEnumerable<T>的方法,直到不必返回为止。所以更喜欢root.Elements(ns + "Params").Elements(ns + "Events").SingleOrDefault()而不是root.Element(ns + "Params").Element(ns +"Events")。这避免了空引用异常。
把这一切加在一起,我们就会得到这样的东西:
XNamespace message = "http://www.example.com/schema/msc/message";
XNamespace referral = "http://www.example.com/schema/msc/referral";
var root = XElement.Parse(xml);
var dto = new
{
    RoutingCode = (string) root.Elements(message + "Params")
        .Elements(referral + "Events")
        .Attributes("Code")
        .Single(),
    User = new
    {
        AccountName = (string) root.Elements(message + "Params")
            .Elements(referral + "Events")
            .Elements(referral + "User")
            .Attributes("Name")
            .Single()
    }
};有关工作示例,请参见这把小提琴。
发布于 2015-11-10 19:01:51
如果使用XElement.Parse而不是XDocument.Parse,那么root元素就是Message元素,任何选择的子元素都应该从Params元素开始。
     RoutingCode = (string)root.Element(ns + "Params")
           .Element(ns2 + "Events")
           .Attribute("Code")发布于 2015-11-10 19:02:12
尝试使用此代码检索属性。
var doc = XDocument.Parse(xml);
XNamespace ns = "http://www.example.com/schema/msc/referral";
doc.Descendants(ns + "Events")
    .Select(e => new DTO {
                            RoutingCode = (string)e.Attribute("Code"),
                            User = new UserDTO((string)e.Element(ns + "User").Attribute("Name"))
                     });https://stackoverflow.com/questions/33637284
复制相似问题