XPath 在使用 DataContractSerializer 创建的 xml 中不起作用

本文关键字:xml 不起作用 创建 DataContractSerializer XPath | 更新日期: 2023-09-27 17:55:16


我有一个数据合同对象,我能够使用 DataContractSerializer 成功地将其序列化为 xml,但是当我尝试使用 XPath 访问节点时,它返回了一个 null。我无法找出为什么会这样。

这就是我到目前为止必须做的。

namespace DataContractLibrary
{
    [DataContract]
    public class Person
    {
        [DataMember]
        public string FirstName { get; set; }
        [DataMember]
        public string LastName { get; set; }
        [DataMember]
        public int Age { get; set; }
    }
}
static void Main(string[] args)
{
    Person dataContractObject = new Person();
    dataContractObject.Age = 34;
    dataContractObject.FirstName = "SomeFirstName";
    dataContractObject.LastName = "SomeLastName";
    var dataSerializer = new DataContractSerializer(dataContractObject.GetType());
    XmlWriterSettings xmlSettings = new XmlWriterSettings { Indent = true, Encoding = Encoding.UTF8, OmitXmlDeclaration = true };
    using (var xmlWriter = XmlWriter.Create("person.xml", xmlSettings))
    {
        dataSerializer.WriteObject(xmlWriter, dataContractObject);
    }
    XmlDocument document = new XmlDocument();
    document.Load("person.xml");
    XmlNamespaceManager namesapceManager = new XmlNamespaceManager(document.NameTable);
    namesapceManager.AddNamespace("", document.DocumentElement.NamespaceURI);
    XmlNode firstName = document.SelectSingleNode("//FirstName", namesapceManager);
    if (firstName==null)
    {
        Console.WriteLine("Count not find the node.");
    }
    Console.ReadLine();
}

谁能让我知道我出了什么问题?您的帮助将不胜感激。

XPath 在使用 DataContractSerializer 创建的 xml 中不起作用

您忽略了放入序列化 XML 中的 XML 命名空间:

<Person xmlns:i="http://www.w3.org/2001/XMLSchema-instance" 
        xmlns="http://schemas.datacontract.org/2004/07/DataContractLibrary">
   <Age>34</Age>
   <FirstName>SomeFirstName</FirstName>
   <LastName>SomeLastName</LastName>
</Person>

因此,在代码中,您需要引用该命名空间:

XmlNamespaceManager namespaceManager = new XmlNamespaceManager(document.NameTable);
namespaceManager.AddNamespace("ns", document.DocumentElement.NamespaceURI);

然后在 XPath 中,您需要使用该命名空间:

XmlNode firstName = document.SelectSingleNode("//ns:FirstName", namespaceManager);
if (firstName == null)
{
   Console.WriteLine("Could not find the node.");
}
else
{
   Console.WriteLine("First Name is: {0}", firstName.InnerText);
}

现在它工作得很好 - 名称被打印到控制台上。