Десериализация XML без указания XmlRootAttribute - PullRequest
2 голосов
/ 08 февраля 2012

вот мой xml:

<connections total="2" >
       <person>
              <id>ohKiUAZWz2</id>
              <first-name>ミ★нιяαℓ</first-name>
              <last-name>§|-|ä|-|»♥«</last-name>
              <headline>--</headline>
            </person>
       <person>
              <id>LmgYe-Nl2a</id>
              <first-name>kunal</first-name>
              <last-name>b</last-name>
              <headline>Student at MscIT,Surat</headline>               
          </person>
</connection>

из кода:

List<LinkWall> LinkWallList = new List<LinkWall>();
            XmlNodeList xmlnode = doc.GetElementsByTagName("person");

            foreach (XmlElement ele in xmlnode)
            {

                XmlRootAttribute xr = new XmlRootAttribute("person");

                XmlSerializer mySerializer = new XmlSerializer(typeof(LinkWall),xr);

                StringReader re = new StringReader(ele.InnerXml);

                LinkWallList.Add((LinkWall)mySerializer.Deserialize(re));
            }

вот мое определение класса:

[XmlRoot("person")]
    public class LinkWall
    {
        public LinkWall()
        { }

        [XmlElement(ElementName =  "id")]
        public string id { get; set; }

        [XmlElement(ElementName = "first-name")]
        public string firstName { get; set; }

        [XmlElement(ElementName = "last-name")]
        public string lastName { get; set; }

        [XmlElement(ElementName = "headline", IsNullable=true)]
        public string headline { get; set; }  
    }

но когда я пытаюсь десериализовать. это показывает мне ошибку вроде: {"Есть несколько корневых элементов."}

Есть ли какое-либо решение или альтернатива для указания XmlRootAttribute?

спасибо заранее, Милан Мендпара

Ответы [ 3 ]

5 голосов
/ 08 февраля 2012

Я думаю, что ваша проблема с этой строкой:

StringReader re = new StringReader(ele.InnerXml);

Измените ее на:

StringReader re = new StringReader(ele.OuterXml);

Причина в том, что свойство InnerXml будет возвращать все дочерние узлы, но неродительский узел.OuterXml также будет включать ваш родительский узел.

т.е. InnerXml не имеет корневого элемента (ну, у него их много!):

<id>ohKiUAZWz2</id>
<first-name>?????al</first-name>
<last-name>§|-|ä|-|»?«</last-name>
<headline>--</headline>

OuterXml соответствует ожидаемому:

<person>
    <id>ohKiUAZWz2</id>
    <first-name>?????al</first-name>
    <last-name>§|-|ä|-|»?«</last-name>
    <headline>--</headline>
</person> 

Нет также реальной необходимости использовать используемый вами конструктор XmlSerializer.Попробуйте:

XmlSerializer mySerializer = new XmlSerializer(typeof(LinkWall));

Вместо.

2 голосов
/ 08 февраля 2012

Попробуйте OuterXml вместо InnerXML

StringReader re = new StringReader(ele.OuterXml);
1 голос
/ 08 февраля 2012

Я считаю, что вы должны сделать класс структурированным, как ваш xml-файл, и десериализовать ваш xml-файл в экземпляр этого класса.

MyClass myObject = new MyClass;
XmlSerializer ser = new XmlSerializer(myObject.GetType());
using (FileStream fs = new FileStream(FilePath, FileMode.Open))
{
    XmlTextReader reader = new XmlTextReader(fs);
    myObject = (MyClass)ser.Deserialize(reader);
}

Этот код работает быстрее, и тогда вы сможете делать то, что хотите, с данными внутри вашего объекта.

...