2013-02-09 101 views
2

我是這樣開始:反序列化XML文件

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)。 「沒有預料到。」

+0

看到http://stackoverflow.com/questions/364253/how -to-deserialize-xml-document – 2013-02-09 06:56:03

+0

@RachelGallen但是xml文件的格式不同。有什麼汽車類,我的例子是什麼? – 2013-02-09 06:57:36

+0

檢出http://i-tools.org/unserialize – 2013-02-09 07:01:24

回答

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? 
}