【问题标题】:How to deserialize an XML doc with a prefixed namespace but no ns-prefixed elements?如何反序列化带有前缀命名空间但没有 ns 前缀元素的 XML 文档?
【发布时间】:2009-01-21 15:50:45
【问题描述】:

我有一个来自外部来源的 XML 文档。

<?xml version="1.0" encoding="utf-8"?>
<ns0:Info xmlns:ns0="http://www.ZomboCorp.com/">
  <Name>Anthony</Name>
  <Job>Developer</Job>
</ns0:Info>

我需要将它反序列化成这样的对象。

public class Info
{
    public String Name { get; set; }
    public String Job { get; set; }
}

按原样使用,Serializer 会抛出 InvalidOperationException

&lt;Info xmlns='http://www.ZomboCorp.com/'&gt; 不是预期的。

如果我将[XmlElement(Namespace = "http://www.ZomboCorp.com/")] 添加到类定义中,Serializer 将返回一个具有空属性的新Info 对象。

【问题讨论】:

    标签: .net xml xml-serialization xml-namespaces


    【解决方案1】:

    您还必须将 XmlElement 属性添加到每个属性,将 Namespace 属性设置为空字符串(因为在您的情况下没有继承命名空间)。

    您对 Info 的定义应如下所示:

    XmlRoot(Namespace = "http://www.ZomboCorp.com/")]
    public class Info
    {
        [XmlElement(Namespace = "")]
        public String Name { get; set; }
        [XmlElement(Namespace = "")]
        public String Job { get; set; }
    }
    

    然后它会正确反序列化。

    【讨论】:

      【解决方案2】:

      我使用xsd.exe(VS 工具)并从 XML 文件生成架构,然后从架构生成类文件。它建议

      [XmlType(AnonymousType = true, Namespace = "http://www.ZomboCorp.com/")]
      [XmlRoot(Namespace = "http://www.ZomboCorp.com/", IsNullable = false)]
      public class Info
      {
          [XmlElement(Form = XmlSchemaForm.Unqualified)]
          public String Name { get; set; }
          [XmlElement(Form = XmlSchemaForm.Unqualified)]
          public String Job { get; set; }
      }
      

      但是,我能够侥幸逃脱

      [XmlType(AnonymousType = true)]
      [XmlRoot(Namespace = "http://www.ZomboCorp.com/")]
      public class Info
      {
          [XmlElement(Form = XmlSchemaForm.Unqualified)]
          public String Name { get; set; }
          [XmlElement(Form = XmlSchemaForm.Unqualified)]
          public String Job { get; set; }
      }
      

      【讨论】:

      • 运行时怎么样?,这可能吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-15
      • 1970-01-01
      • 2011-01-21
      • 2013-05-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多