【问题标题】:Reading attribute from an XML file从 XML 文件中读取属性
【发布时间】:2020-11-11 21:57:00
【问题描述】:

我有一个如下所示的 XML 文件

<SendInvoiceResult xmlns="http://tempuri.org/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" IsSucceded="true">
  <Value Id="123456" Number="1" InvoiceScenario="Scenario" /> 
</SendInvoiceResult>

我正在尝试读取此文件的属性,但到目前为止,我基于 Stackoverflow 上的其他问题所做的所有尝试都返回 null 或“对象引用未设置为对象的实例”错误。

我最近的尝试是这样的:

var testXml = new XmlDocument();
testXml.LoadXml(test);

var node = testXml.SelectSingleNode("/SendInvoiceResult/Value");
var id = node.Attributes["Id"].Value;

这种方法也返回“对象引用未设置为对象的实例”。我想知道此时 XML 的结构方式是否有问题。

我当然愿意接受新的方法和建议,我只需要读取这个和其他类似 XML 文件中的属性值。

【问题讨论】:

    标签: c# xml xml-parsing


    【解决方案1】:

    使用 XDocument。它更加现代和强大。

    var doc = XElement.Load(test);
    var id = doc.Root.Element("Value").Attribute("Id").Value;
    

    【讨论】:

    • 请让代码工作。修正拼写错误并使用命名空间。
    【解决方案2】:

    您必须定义 xml 命名空间。

    var doc = new XmlDocument();
    doc.Load("test.txt");
    
    var manager = new XmlNamespaceManager(doc.NameTable);
    manager.AddNamespace("ns", "http://tempuri.org/");
    
    var node = doc.SelectSingleNode("/ns:SendInvoiceResult/ns:Value", manager);
    var id = node.Attributes["Id"].Value;
    
    Console.WriteLine(id);
    

    更好地使用现代和更方便的 linq to xml。

    using System.Xml.Linq;
    

    var doc = XDocument.Load("test.txt");
    XNamespace ns = "http://tempuri.org/";
    var id = doc.Root.Element(ns + "Value").Attribute("Id").Value;
    Console.WriteLine(id);
    

    【讨论】:

      猜你喜欢
      • 2021-08-08
      • 1970-01-01
      • 1970-01-01
      • 2012-01-21
      • 1970-01-01
      • 2021-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多