1

我对 XML 和 LINQ 都很陌生。我已经阅读了几篇 XML to 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# BTW(不确定我是否需要这么说或者标签是否足够)。

4

1 回答 1

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

获取行,包含一个 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)};
于 2013-04-28T22:02:27.603 回答