XML解析为属性返回null

时间:2012-11-28 18:22:50

标签: c# xml linq-to-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获取null。这是我的代码,我不确定我做错了什么,我正在使用我编写的解析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"));
}

非常感谢,

阿曼达

2 个答案:

答案 0 :(得分: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 :(得分:2)

问题是import_seqfield_name的值不是属性,它们是元素({{}的子元素1}}元素)。您可以继续阅读阅读器中的元素(不是太容易),或者您可以使用LINQ-to-XML或序列化等方法来检索数据。