Xml反序列化没有根节点

时间:2013-11-11 16:39:48

标签: xml c#-4.0 xml-deserialization

我有一个XML文件,我正在接收第三方提供商。

它没有以传统方式构建,它基本上没有Root: -

<DG_X
    attrib1="Test2"
    attrib2="1"
    attrib3="12345">TEST-23456</DG_X>
<DG_Y
    attrib1="test"
    attrib2="Example Text"
    attrib3="1"
    attrib4="3"
    attrib5= 1
    attrib6="12412342134">Test-1234567</DG_Y>

我只对第一个元素“DG_X”感兴趣,我只需要它的值“TEST-23456”。

我是De-Serialistaion的新手,到目前为止我的尝试都失败了: -

[Serializable]
    [XmlRoot("DG_X")]
    public class DM
    {
        [XmlText]
        public string Value { get; set; }

        [XmlAttribute]
        public string attrib1 { get; set; }

        [XmlAttribute]
        public string attrib2 { get; set; }

        [XmlAttribute]
        public string attrib3 { get; set; }

        [XmlIgnore]
        [XmlElement("DG_Y")]
        public string dg_key { get; set; }

    }

问题在于读取第二个元素,编译器建议有两个根元素。解决这个问题的最佳方法是什么?

2 个答案:

答案 0 :(得分:1)

以下内容适用于您的示例


 XmlReader xR = XmlReader.Create(@"example.xml");
            xR.MoveToContent();

            XmlSerializer xser = new XmlSerializer(typeof(DM));
            DM dmInstance = xser.Deserialize(xR) as DM;

我们基本上使用XmlReader将selfelfs放在第一个元素上,并使用它来反序列化到对象实例中。

希望这有帮助,

答案 1 :(得分:0)

我设法通过以下代码解决了我的问题: -

这是我唯一可以在文件中没有根节点的方法。

using (var fileSteam = new StreamReader(fileStream))
            {
                var settings = new XmlReaderSettings {ConformanceLevel = ConformanceLevel.Fragment};

                using (var reader = XmlReader.Create(fileSteam, settings))
                {
                    if (!reader.IsStartElement()) 
                        return String.Empty;

                    var reference = reader.ReadElementContentAsString();
                    return reference.StartsWith("DM-") ? reference : string.Format("DM-{0}", reference);
                }