【问题标题】:XML to LINQ with metadata带有元数据的 XML 到 LINQ
【发布时间】:2013-04-22 11:48:04
【问题描述】:

我对 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(不确定我是否需要这样说或者标签是否足够)。

【问题讨论】:

    标签: c# xml-parsing linq-to-xml


    【解决方案1】:

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

    【讨论】:

    • 关于格式不正确的 XML 文档,原件是正确的,不小心把它从我的示例中删除了。我正在尝试提取 标签之间的任何内容。最终我要么想在 XML 上运行一个查询,要么把它全部放到一个列表中(我还没有决定哪个)。
    • 我回答中的最后一个 LINQ 查询将给出一个 IEnumerable 行。通过它们进行枚举时,您有一个名为 values 的 IEnumerable,其中包含该行的 3 个值。因为值元素没有属性,所以无法将它们标识为 Term、Subject 等,它们都只是值元素。如果您可以控制 XML 的外观,那么添加属性会在查询时为您提供更好的结果
    猜你喜欢
    • 2013-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    相关资源
    最近更新 更多