【问题标题】:Get XElement from XML using LINQ使用 LINQ 从 XML 获取 XElement
【发布时间】:2015-06-01 19:31:32
【问题描述】:

我有一个文件路径已经加载到 XDocument 中。我正在尝试获取 XElement,但找不到任何好的来源。

是否可以使用 LINQ to XML 获取 XElement 标记?

XML 看起来像:

<?xml version="1.0" encoding="UTF-8"?>
<transactionBlock>
    <trans aux ID="1849" company ID="ABC">
        <T.2.12.0>
            <event TS>16:02:56Z</event TS>
            <equipment ID="0105449160" mobile Type="2" equip Type="tractor"/>
            <driver ID>002</driver ID>
        </T.2.12.0>
    </trans>
    <trans aux ID="1854" company ID="XYZ">
        <T.2.06.0>
            <event TS>16:07:50Z</event TS>
            <equipment ID="0105449160" mobile Type="3"/>
            <driver ID>002</driver ID>
        </T.2.06.0>
    </trans>
</transactionBlock>

【问题讨论】:

  • XML 示例:16:02:56ZTS> 002ID> 16:07:50ZTS> 002ID> Block>
  • 你想要哪个元素,只需使用 XDocumentInstance.Root.Elements() 将给出所有元素。
  • 我只想要 ,。我将这些值作为 XElement 传递给以后运行。
  • 您尝试过任何研究吗? LINQ to XML 有很好的文档记录,并且有大量示例 - 这里只是 SO 中的一个:stackoverflow.com/a/5560720/745969
  • 事务块是无效的 xml 元素名称。 XML 元素必须遵循以下命名规则: 元素名称区分大小写 元素名称必须以字母或下划线开头 元素名称不能以字母 xml(或 XML 或 Xml 等)开头 元素名称可以包含字母、数字、连字符、下划线和句点 元素名称不能包含空格 可以使用任何名称,不保留任何字词(xml 除外)。 w3schools.com/xml/xml_elements.asp

标签: xml linq


【解决方案1】:

我发现使用 XPath 表达式在 XML 元素中导航更容易,因为它可以处理过滤器和对现有结构更直接的方法。在这种情况下,您可以这样做:

var doc = XDocument.Parse(@"<?xml version='1.0' encoding='UTF-8'?>
    <transactionBlock>
        <trans auxID='1849' companyID='ABC'>
            <T.2.12.0>
                <eventTS>16:02:56Z</eventTS>
                <equipment ID='0105449160' mobileType='2' equipType='tractor'/>
                <driverID>002</driverID>
            </T.2.12.0>
        </trans>
        <trans auxID='1854' companyID='XYZ'>
            <T.2.06.0>
                <eventTS>16:07:50Z</eventTS>
                <equipment ID='0105449160' mobileType='3'/>
                <driverID>002</driverID>
            </T.2.06.0>
        </trans>
    </transactionBlock>");

var transactions = doc.XPathSelectElements("/transactionBlock/trans/*");
foreach (var transaction in transactions)
{
    Console.WriteLine(transaction.Name);
}

【讨论】:

    【解决方案2】:
    IEnumerable<string> transactions = doc.Root.Descendants("trans").Where(x => string.Compare(x.Name.LocalName, "trans") == 0 && x.HasElements).Select(x => (x.FirstNode as XElement).Name.LocalName);
                    foreach (var item in transactions)
                    {
                        Console.WriteLine(item);     
                    }
    

    【讨论】:

      【解决方案3】:

      我希望它会帮助某人:

      解决办法:

             var doc = XDocument.Load(File);
              var transactions = doc.Root.Elements().Select(t => t.Elements().First());
      
              foreach (var transaction in transactions)
              {
                  var id = transaction.Name.LocalName;
                  Console.WriteLine(id);
              }
      

      输出:

      T.2.12.0

      T.2.06.0

      【讨论】:

      • 如果t里面没有元素,那么调用t,First()会抛出异常“Sequence Contains no element”。
      • @Dreamweaver 感谢您分享您的解决方案。就我而言,我们总是有一个元素。
      猜你喜欢
      • 2021-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-24
      • 2011-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多