带元数据的XML转换为LINQ
本文关键字:LINQ 转换 XML 元数据 | 更新日期: 2023-09-27 18:11:10
我对XML和LINQ都很陌生。我读过几本从XML到LINQ的教程,但是没有一本XML文档的格式和我的一样。我不确定它是否(以及如何)改变了事情。
我在网上看到的所有例子似乎都遵循这种格式:
<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文档没有遵循相同的格式。它不是为每个词重复不同的标签,而是在顶部有一组元数据,然后对每组数据使用相同的标签。
下面是我的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#(不确定我是否需要这样说,或者标签是否足够)。
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");
获取行,包含值的IEnumerable
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)};