【问题标题】:How to use XmlSerializer to deserialise XML that has multiple xlmns attributes如何使用 XmlSerializer 反序列化具有多个 xmlns 属性的 XML
【发布时间】:2012-02-20 10:23:24
【问题描述】:

我正在尝试像这样反序列化一个 XML 文件(它实际上是一个 maven POM,但现在这并不重要......):

<?xml version="1.0" encoding="UTF-8"?>
<project 
    xmlns="http://maven.apache.org/POM/4.0.0" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">

  <modelVersion>4.0.0</modelVersion> 
</project>

我有一个手动定义的 POM 类:

[XmlRoot(Namespace= "http://maven.apache.org/POM/4.0.0")]
public class POM
{
    [XmlElement("modelVersion")]
    public string ModelVersion{ get; set; }
}

...和我的反序列化代码:

FileStream fileStream = File.Open("pom.xml", FileMode.Open, FileAccess.Read, FileShare.Read);
var codec = new XmlSerializer(typeof(POM));
var pom = (POM) codec.Deserialize(fileStream);

当我运行它时,我得到 InvalidOperationException: 'project xmlns="http://maven.apache.org/POM/4.0.0"' 不是预期的。

如何让反序列化器处理额外的 xmlns 属性和 xsi:schemalocation ?

当我删除它们时,代码运行没有错误。

谢谢,迈克尔

【问题讨论】:

  • 我不认为这是多个命名空间,我认为是您的类称为 POM 而您的根节点称为项目。

标签: c# .net xml xml-namespaces xmlserializer


【解决方案1】:

只需将ElementName 添加到XmlRootAttribute,因为您的根元素具有project 名称,即:

[XmlRoot(Namespace = "http://maven.apache.org/POM/4.0.0", ElementName = "project")]

【讨论】:

  • 基里尔(和本),非常感谢。发现!无论如何,我已经将该类重命名为 Project,因为它就是这样(我被 POM 挂断了......)。
【解决方案2】:

将 ElementName="project" 放在 xml 根属性中,见下文

[XmlRoot(ElementName="project" ,Namespace = "http://maven.apache.org/POM/4.0.0")]
 public class POM
 {
    [XmlElement("modelVersion")]
    public string ModelVersion { get; set; }
 }

【讨论】:

  • 是的..当你回答时我的页面没有刷新..我发布答案后才知道
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-24
  • 2021-06-24
  • 1970-01-01
  • 1970-01-01
  • 2012-04-28
  • 2010-11-20
相关资源
最近更新 更多