带元数据的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转换为LINQ

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)};