2013-04-28 80 views
1

我对XML和LINQ都很新。我已经阅读了几本关于LINQ教程的XML,但没有一篇XML文档似乎按照我的方式进行格式化。我不确定是否(以及如何)改变了事情。XML到LINQ与元数据

我在互联网上阅读所有的例子似乎遵循这种格式:

<data> 
<row> 
    <Term>201320</Term> 
    <Subj>ACCT</Subj> 
    <Subj_desc>Accounting</Subj_desc> 
</row> 
<row> 
    <Term>201320</Term> 
    <Subj>ACCT</Subj> 
    <Subj_desc>Accounting</Subj_desc> 
</row> 
</data> 

如果我想读,我认为代码将是这个样子:

XDocument document = XDocument.Load("URLHERE.xml"); 

var term = from row in document.Descendants("row") 
select new 
{ 
Term = row.Element("Term").Value, 
Subject = row.Element("Subj").Value, 
Subject_Description = row.Element("Subj_desc").Value, 
}; 

问题在于:我的XML文档不遵循相同的格式。不是为每个术语重复不同的标签,而是在顶部有一组元数据,然后对每组数据使用SAME标签。

这里是我的XML文档的样本:

<metadata> 
    <item name="TERM" type="xs:string" length="128"/> 
    <item name="SUBJ" type="xs:string" length="128"/> 
    <item name="SUBJECT_DESC" type="xs:string" length="512"/> 
</metadata> 
<data> 
<row> 
    <value>201320</value> 
    <value>ACCT</value> 
    <value>Accounting</value> 
</row> 
<row> 
    <value>201320</value> 
    <value>ACCT</value> 
    <value>Accounting</value> 
</row> 
</data> 

我将如何从中提取数据?

var term = from row in document.Descendants("row") 
select new 
{ 
Term = row.Element("value").Value, 
Subject = row.Element("value").Value, 
}; 

看起来不对。我正在使用C#顺便说一句(不知道我是否需要说或标签是否足够)。

回答

0

您的XML格式不正确,您需要一个封装整个文档的根元素。如

<?xml version='1.0' encoding='utf-8'?> 
<root> 
<metadata> 
    <item name="TERM" type="xs:string" length="128"/> 
    <item name="SUBJ" type="xs:string" length="128"/> 
    <item name="SUBJECT_DESC" type="xs:string" length="512"/> 
</metadata> 
<data> 
<row> 
    <value>201320</value> 
    <value>ACCT</value> 
    <value>Accounting</value> 
</row> 
<row> 
    <value>201320</value> 
    <value>ACCT</value> 
    <value>Accounting</value> 
</row> 
</data> 
</root> 

然后使用的XDocument,你可以加载文件

var doc = XDocument.Load("file.xml"); 

那么你就可以提取数据,还挺取决于要提取什么,你永远不指定。例如获得所述元数据

var item = doc.Descendants("metadata"); 

得到的行,包含值

XDocument document = XDocument.Load("c:\\tmp\\test.xml"); 
var rows = from i in document.Descendants("row") 
      select new {values = i.Elements("value").Select(a=>a.Value)}; 
+0

关于不正确格式的XML文档,原来是正确的IEnumerable的,留下了从我的样品通过事故。 我试图提取标记之间的任何东西。最终,我要么对XML运行查询,要么将其全部放入列表中(我还没有确定它)。 – rayden54 2013-04-28 23:26:37

+0

我的答案中的最后一个LINQ查询将给出IEnumerable的行。当通过它们枚举时,你有一个IEnumerable被调用的值包含该行的3个值。由于价值元素没有属性,因此不可能将它们识别为术语,主题等,它们都只是价值元素。如果您可以控制XML的外观,那么添加属性在查询时会给您一个更好的结果 – James 2013-04-29 06:56:11