c# - 反序列化 XML 文件

标签 c# xml deserialization

我是这样开始的:

System.Xml.Serialization.XmlRootAttribute xRoot = new System.Xml.Serialization.XmlRootAttribute();
xRoot.IsNullable = true;
xRoot.Namespace = "urn:schemas-microsoft-com:rowset";
System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(typeof(ProductSalesList), xRoot);
System.Xml.XmlReader reader = new System.Xml.XmlTextReader(path + "\\" + file);
eltOnly e = (eltOnly)serializer.Deserialize(reader);

但我不知道如何继续。这是 xml 文件:

<xml xmlns:s='uuid:00000000-6DA3-11d1-A2A3-00AA00C14882'
xmlns:dt='uuid:C2F41010-0000-11d1-A29F-00AA00C14882'
xmlns:rs='urn:schemas-microsoft-com:rowset'
xmlns:z='#RowsetSchema'>
<s:Schema id='RowsetSchema'>
<s:ElementType name='row' content='eltOnly'>
    <s:AttributeType name='Art' rs:number='1' rs:nullable='true' rs:maydefer='true' rs:writeunknown='true'>
        <s:datatype dt:type='string' dt:maxLength='255'/>
    </s:AttributeType>
    <s:AttributeType name='Name' rs:number='2' rs:nullable='true' rs:maydefer='true' rs:writeunknown='true'>
        <s:datatype dt:type='string' dt:maxLength='255'/>
    </s:AttributeType>
    <s:AttributeType name='Sum' rs:number='3' rs:nullable='true' rs:maydefer='true' rs:writeunknown='true'>
        <s:datatype dt:type='float' dt:maxLength='8' rs:precision='15' rs:fixedlength='true'/>
    </s:AttributeType>
    <s:AttributeType name='Cost' rs:number='4' rs:nullable='true' rs:maydefer='true' rs:writeunknown='true'>
        <s:datatype dt:type='float' dt:maxLength='8' rs:precision='15' rs:fixedlength='true'/>
    </s:AttributeType>
    <s:extends type='rs:rowbase'/>
    </s:ElementType>
</s:Schema>
<rs:data>
    <z:row Art='0000000001' Name='Brand pils 0,2' Sum='153' Cost='304'/>
    <z:row Art='0000000002' Name='Brand pils 0,25' Sum='11' Cost='25.300000000000004'/>
    <z:row Art='0000000003' Name='Brand pils 0,5' Sum='3' Cost='13.799999999999999'/>
</rs:data>
</xml>

如何继续?我应该如何调用具有反序列化属性的类?

这就是我所做的:

[Serializable()]
public class Elt
{
    [System.Xml.Serialization.XmlElement]
    public string Art { get; set; }
    [System.Xml.Serialization.XmlElement]
    public string Name { get; set; }
    [System.Xml.Serialization.XmlElement]
    public float? Sum { get; set; }
    [System.Xml.Serialization.XmlElement]
    public float? Cost { get; set; }
}


[Serializable, System.Xml.Serialization.XmlRoot("eltOnly")]
public class eltOnly
{
    [System.Xml.Serialization.XmlElement]
    public List<Elt> Elt { get; set; }
}

我收到错误:XML 文档 (1, 2) 中存在错误。 “没有预料到。”

最佳答案

这个linq2xml应该做你想要的......

XDocument doc=XDocument.Load(yourXml);
XNamespace rs="urn:schemas-microsoft-com:rowset";
XNamespace z="#RowsetSchema";
var lstRows=doc.Descendants(rs+"data").Elements(z+"row").Select(x=>
    new
    {
         art=x.Attribute("Art").Value,
         name=x.Attribute("Name").Value,
         sum=(float?)x.Attribute("Sum"),
         cost=(float?)x.Attribute("Cost")
    }
   );

您现在可以迭代 lstRows

foreach(var row in lstRows)
{
    row.art;//string
    row.name;//string
    row.sum;//float?
    row.cost;//float?
}

关于c# - 反序列化 XML 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14785714/

相关文章:

c# - 在没有 WSDL 的情况下反序列化来自 Web 服务的 SOAP 响应

c# - JSON 反序列化中的类型提示

c# - 带有 FluentValidation 的 StructureMap

c# - 为什么 DefaultIfEmpty 是这样实现的?

c# - 如何调用一个方法,该方法将 params string[] 作为其唯一参数而不发送值

android - 一行内表格布局中的图像问题

c# - 如何导航到另一个项目的 View

c# - 将数据从 XML 导入到 SQL Server 表

javascript - 使用 jQuery 遍历 XML 获取元素值

Java 未经检查或不安全操作消息