как игнорировать пространства имен XML? - PullRequest
2 голосов
/ 11 октября 2011

У меня есть тестовый XML-файл, который выглядит следующим образом:

<Person>
  <ContactInfo>
   ...
  <ContactInfo>
</Person>

Когда я пытаюсь десериализовать, все работает нормально.Но проблема в том, что иногда структура этого XML-файла отличается - иногда добавляются пространства имен XML.

<Person xmlns:xsd="http://www.w3.org/2001/XMLSchema"    
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
  <ContactInfo>
   ...
  <ContactInfo>
</Person>

И теперь, когда я сериализуюсь, я получаю IOnvalidOperationException: «В документе XML есть ошибка(1, 2) ".Внутреннее сообщение об исключении говорит, что <Person xmlns='http://tempuri.org/PaymentInformationXml.xsd'> не ожидалось.

Так кто-нибудь может мне помочь с этим?

Ответы [ 3 ]

4 голосов
/ 11 октября 2011

Пространство имен является фундаментальным в XML (в отличие от пространств имен, которые являются взаимозаменяемыми).Если Person находится в этом пространстве имен, вы должны указать это:

[XmlRoot(Namespace="http://tempuri.org/PaymentInformationXml.xsd")]
public class Person {...}
0 голосов
/ 11 октября 2011

здесь есть статья о xml здесь

И я также наткнулся на этот кусок кода: (очень полезно)

XmlDocument stripDocumentNamespace(XmlDocument oldDom)
{
// Remove all xmlns:* instances from the passed XmlDocument
// to simplify our xpath expressions.
XmlDocument newDom = new XmlDocument();
newDom.LoadXml(System.Text.RegularExpressions.Regex.Replace(
oldDom.OuterXml, @"(xmlns:?[^=]*=[""][^""]*[""])", "",
System.Text.RegularExpressions.RegexOptions.IgnoreCase | System.Text.RegularExpressions.RegexOptions.Multiline)
);
return newDom;
} 

надеюсь, что это может помочь

0 голосов
/ 11 октября 2011

Извлечение XmlSerializerNamespaces .

XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
ns.Add("xsd", "http://www.w3.org/2001/XMLSchema");
ns.Add("xsi", "http://www.w3.org/2001/XMLSchema-instance");

Управление пространством имен по умолчанию может быть выполнено непосредственно на XmlSerializer:

XmlSerializer xs = new XmlSerializer(typeof(Person), "http://tempuri.org/PaymentInformationXml.xsd");

... но ваш вопрос немного неясен относительно того, откуда возникла проблема.

Проверьте свой Person класс * атрибут [XmlType]:

[XmlType(Namespace="http://tempuri.org/PaymentInformationXml.xsd")]
public class Person
{
    //...
}

Пространство имен для вашего типа Person должно соответствовать тому, которое вы используете при сериализации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...