Как использовать XmlSerializer для десериализации XML, который имеет несколько атрибутов xlmns - PullRequest
2 голосов
/ 20 февраля 2012

Я пытаюсь десериализовать такой XML-файл (на самом деле это POM maven, но это сейчас не важно ...):

<?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?

Когда я их удаляю, код запускается без ошибок.

Спасибо, Майкл

Ответы [ 2 ]

1 голос
/ 20 февраля 2012

Просто добавьте ElementName к XmlRootAttribute, потому что ваш корневой элемент имеет имя project, то есть:

[XmlRoot(Namespace = "http://maven.apache.org/POM/4.0.0", ElementName = "project")]
0 голосов
/ 20 февраля 2012

положить 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; }
 }
...