【问题标题】:how to ignore xml namespaces?如何忽略 xml 命名空间?
【发布时间】:2011-12-05 13:19:32
【问题描述】:

我有一个如下所示的测试 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) 中存在错误”。内部异常消息说 &lt;Person xmlns='http://tempuri.org/PaymentInformationXml.xsd'&gt; 不是预期的。

那么有人可以帮我解决这个问题吗?

【问题讨论】:

  • 你用什么反序列化?
  • 您的示例XML和错误信息不一致; xsi/xsd 只是命名空间别名——它们不会改变任何东西。你几乎可以忽略这两个。但是,xmlns='...blah...'非常很重要。请澄清:这是否在您的 XML 中?如果是,必须提前告诉XmlSerializer

标签: .net xml serialization deserialization xml-namespaces


【解决方案1】:

查看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 类型的命名空间需要与序列化时使用的命名空间一致。

【讨论】:

  • 问题不是 xsi/xsd,而是 xmlns= 这意味着 XmlSerializerNamespaces 在这里没有做任何事情,
【解决方案2】:

命名空间是 XML 的基础(与可互换的命名空间不同)。如果 Person 在那个命名空间中,你必须告诉它:

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

【讨论】:

    【解决方案3】:

    有一篇关于xml的文章here

    我还偶然发现了这段代码:(非常有帮助)

    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;
    } 
    

    希望这会有所帮助

    【讨论】:

      猜你喜欢
      • 2015-02-18
      • 2011-12-29
      • 1970-01-01
      • 1970-01-01
      • 2016-12-18
      • 1970-01-01
      • 2011-02-17
      • 2012-09-17
      • 1970-01-01
      相关资源
      最近更新 更多