2012-10-05 51 views
2

我想阅读下面的XML文件读双嵌套的XML

<Tabellen> 
<Header> 
    <Tables> 
     <Table>SW_RL</Table> 
      <Fields> 
       <Field>KeyVeld</Field> 
       <Type>Alpha</Type> 
       <Size>100</Size> 
       <SubType>st_none</SubType> 
      </Fields> 
      <Fields> 
       <Field>ErrorCode</Field> 
       <Type>Alpha</Type> 
       <Size>50</Size> 
       <SubType>st_none</SubType> 
      </Fields> 
      <Fields> 
       <Field>Description</Field> 
       <Type>Memo</Type> 
       <Size>100</Size> 
       <SubType>st_none</SubType> 
      </Fields> 
     </Tables> 
</Header> 
<Header> 
    <Tables> 
     <Table>SW_RH</Table> 
    <Fields> 
     <Field>DocNum</Field> 
     <Type>Numeric</Type> 
     <Size>0</Size> 
     <SubType>st_none</SubType> 
    </Fields> 
    <Fields> 
     <Field>PaymentTerms</Field> 
     <Type>Numeric</Type> 
     <Size>0</Size> 
     <SubType>st_none</SubType> 
    </Fields> 
    <Fields> 
     <Field>DocDate</Field> 
     <Type>Date</Type> 
     <Size>0</Size> 
     <SubType>st_none</SubType> 
    </Fields> 
    <Fields> 
     <Field>Contract_Start</Field> 
     <Type>Date</Type> 
     <Size>0</Size> 
     <SubType>st_none</SubType> 
    </Fields> 
    <Fields> 
     <Field>Contract_End</Field> 
     <Type>Date</Type> 
     <Size>0</Size> 
     <SubType>st_none</SubType> 
    </Fields> 
    <Fields> 
     <Field>CardCode</Field> 
     <Type>Alpha</Type> 
     <Size>40</Size> 
     <SubType>st_none</SubType> 
    </Fields> 
    <Fields> 
     <Field>CardName</Field> 
     <Type>Alpha</Type> 
     <Size>100</Size> 
     <SubType>st_none</SubType> 
    </Fields> 
    <Fields> 
     <Field>BillToAddress</Field> 
     <Type>Alpha</Type> 
     <Size>100</Size> 
     <SubType>st_none</SubType> 
    </Fields> 
    <Fields> 
     <Field>ShipToAddress</Field> 
     <Type>Alpha</Type> 
     <Size>100</Size> 
     <SubType>st_none</SubType> 
    </Fields> 
    <Fields> 
     <Field>NumAtCard</Field> 
     <Type>Alpha</Type> 
     <Size>100</Size> 
     <SubType>st_none</SubType> 
    </Fields> 
    <Fields> 
     <Field>BillingPeriod</Field> 
     <Type>Alpha</Type> 
     <Size>10</Size> 
     <SubType>st_none</SubType>  
    </Fields> 
    <Fields> 
     <Field>AdvanceBilling</Field> 
     <Type>Alpha</Type> 
     <Size>10</Size> 
     <SubType>st_none</SubType> 
    </Fields> 
    </Tables> 
</Header> 
</Tabellen> 

当前代码

XmlDocument xmldoc = new XmlDocument(); 
xmldoc.Load(directory + "\\Server_Config.xml"); 
XmlNodeList xmlNodelist = null; 
XmlNodeList xmlNodelist2 = null; 

xmlNodelist = xmldoc.SelectNodes("Tabellen/Header/Tables"); 
foreach (XmlNode mnode in xmlNodelist) 
{ 
    MessageBox.Show(mnode["Table"].InnerText, "ok"); 
    //create table 

    xmlNodelist2 = xmldoc.SelectNodes("Tabellen/Header/Tables/Fields"); 
    foreach (XmlNode mnode2 in xmlNodelist2) 
    { 
     MessageBox.Show(mnode2["Field"].InnerText, "ok"); 
     // create fields 
    } 

} 

总的想法是创建2个表 表1:含3场 RL表2:包含12个区域的RH

但实际上结果是两个表都包含15个区域

我在做什么错?

+0

你是如何阅读XML的? 'DataSet.ReadXML'? –

回答

1

Linq2Xml更易于使用。

XDocument xDoc = XDocument.Load("myfile.xml"); 
var tables = xDoc.Descendants("Header") 
       .Select(h => new 
       { 
        Table = h.Descendants("Table").First().Value, 
        Fields = h.Descendants("Fields") 
           .Select(f=>new{ 
            Field = f.Element("Field").Value, 
            Type = f.Element("Type").Value, 
            Size = f.Element("Size").Value, 
            SubType = f.Element("SubType").Value 
           }) 
           .ToList() 
       }) 
       .ToList(); 
0
xmlNodelist2 = xmldoc.SelectNodes("Tabellen/Header/Tables/Fields"); 

应该

xmlNodelist2 = mnode.SelectNodes("Fields"); 

否则你在XML选择所有字段,而不仅仅是当前桌子底下的人。

(但我没有测试代码)