#c# #xml #xpath #datacontractserializer
#c# #xml #xpath #datacontractserializer
Вопрос:
У меня есть объект datacontract, и я могу успешно сериализовать его в xml с помощью DataContractSerializer, но когда я попытался один раз получить доступ к узлу с помощью 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();
}
Кто-нибудь может сообщить мне, что у меня пошло не так?
Мы были бы очень признательны за вашу помощь.
Комментарии:
1. @marc_s он использует еще одно пространство имен: — » w3.org/2001/XMLSchema-instance » , но даже после добавления этой строки namesapceManager. AddNamespace(«i», » w3.org/2001/XMLSchema-instance » ); , Я получаю его только как null
2. По какой-то причине добавление этого пространства имен с пустым префиксом `»»`, похоже, не работает. Если я добавлю его с
ns=
префиксом и использую этот префикс, у меня все работает просто отлично…
Ответ №1:
Вы игнорируете пространство имен 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);
}
Теперь это работает просто отлично — имя печатается на консоли.