2012-11-28 169 views
1

返回null我有一个看起来像这样的XML文件:XML解析为属性

<?xml version="1.0" standalone="yes"?> 
<NewDataSet> 
    <DT100> 
    <company_id>online00020120523888</company_id> 
    <template_type>100</template_type> 
    <import_seq>1</import_seq> 
    <field_name>cust_acct_no</field_name> 
    <display_name>Account No</display_name> 
    <data_type>0</data_type> 
    <internal_num>0</internal_num> 
    <internal_info>{}</internal_info> 
    </DT100> 
    . 
    . 
    . 

每个DT100,我想读import_seq和FIELD_NAME到字典中。但是,当我通过调试器时,我得到了import_seq和field_name的空值。这里是我的代码,我不知道我在做什么错误,我使用了一些我写的解析XML的早期代码,所以我认为应该正在工作,但它不是。

XDocument doc = XDocument.Load("foo.xtp"); 
String feed = doc.ToString(); 

string import_seq = ""; 
string field_name = ""; 
XmlReader r = XmlReader.Create(new StringReader(feed)); 

Dictionary<string, string> custXML = new Dictionary<string, string>(); 
r.ReadToFollowing("NewDataSet"); 

if(r.ReadToDescendant("DT100")) 
{ 
    do 
    { 
     import_seq = r.GetAttribute("import_seq"); 
     field_name = r.GetAttribute("field_name"); 
     custXML.Add(import_seq, field_name); 

    } 
    while (r.ReadToNextSibling("DT100")); 
} 

非常感谢,

阿曼达

回答

3

您可以创建字典,这个简单的LINQ to XML查询:

Dictionary<int, string> custXML = 
      doc.Descendants("DT100") 
       .ToDictionary(d => (int)d.Element("import_seq"), 
          d => (string)d.Element("field_name")); 

是的,正如你所看到的,值要提取物是元素,而不是属性。阅读有关差异here

+1

谢谢你,工作就像一个魅力,是的,我仍然在学习我的XML术语! –

+0

@Amanda_Panda我认为这个链接对你很有用http://www.w3schools.com/dtd/dtd_el_vs_attr.asp –

2

的问题是,import_seqfield_name值不属性,他们元素(该<DT100>元素的儿童)。您可以继续阅读阅读器中的元素(不是很容易),也可以使用LINQ-to-XML或序列化等方式来检索数据。