我有一个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; }
}
问题在于读取第二个元素,编译器建议有两个根元素。解决这个问题的最佳方法是什么?
答案 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);
}