0

我有一个从第三方提供商处收到的 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; }

    }

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

4

2 回答 2

1

以下应该适用于您的示例


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

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

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

希望这可以帮助,

于 2013-11-11T16:58:50.620 回答
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);
                }
于 2013-11-12T11:39:29.520 回答