LINQ to XML:如何在 C# 中获取元素值?

Posted

技术标签:

【中文标题】LINQ to XML:如何在 C# 中获取元素值?【英文标题】:LINQ to XML: How to get element value in C#? 【发布时间】:2020-10-23 12:59:44 【问题描述】:

我有这个 XML 结构:

<?xml version="1.0" encoding="utf-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope">
  <SOAP-ENV:Header>
    <dlv:delivery xmlns:dlv="http://schemas.biztalk.org/btf-2-0/delivery">
      <dlv:message>
        <dlv:messageID>SDID20200921053955</dlv:messageID>
        <dlv:sent>2020-09-21T05:39:55</dlv:sent>
      </dlv:message>
      <dlv:to>
        <dlv:address>urn:schindler:SchindlerDraw:prod</dlv:address>
      </dlv:to>
      <dlv:from>
        <dlv:address>urn:schindler:logical-system:CRM</dlv:address>
      </dlv:from>
      <dlv:from>
        <dlv:system>PC1</dlv:system>
      </dlv:from>
    </dlv:delivery>
  </SOAP-ENV:Header>
  <SOAP-ENV:Body>
    <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
      <asx:values>
        <SALESORDER>
          <EXTENSIONIN>
            <item>
              <CONFIRMATIONPRINTDATE />
              <CUSTOMEROFFERNOTE />
              <CUSTOMERREFERENCE />
           </item>
          </EXTENSIONIN>
        </SALESORDER>
      </asx:values>
    </asx:abap>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

有谁知道我如何从元素“item”中获取所有值?

结果应该是:

确认打印日期 客户优惠 客户参考

提前谢谢你。

【问题讨论】:

这是一个 SOAP 响应。 .Net 内置了 SOAP 端点 这能回答你的问题吗? consume SOAP web service 否,因为我需要有命令来获取这些值。 【参考方案1】:

使用 xml linq:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication1

    class Program
    
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        
            XDocument doc = XDocument.Load(FILENAME);
            XElement delivery = doc.Descendants().Where(x => x.Name.LocalName == "delivery").FirstOrDefault();
            XNamespace dlv = delivery.GetNamespaceOfPrefix("dlv");
            Envelope envelope = new Envelope();

            envelope.messageId = (string)delivery.Descendants(dlv + "messageID").FirstOrDefault();
            envelope.sent = (DateTime)delivery.Descendants(dlv + "sent").FirstOrDefault();
            envelope.toAddr = (string)delivery.Descendants(dlv + "from").FirstOrDefault().Element(dlv + "address");
            envelope.fromAddr = (string)delivery.Descendants(dlv + "to").FirstOrDefault().Element(dlv + "address");
            envelope.system = (string)delivery.Descendants(dlv + "system").FirstOrDefault();

            envelope.items = doc.Descendants("item").FirstOrDefault().Elements()
                .GroupBy(x => x.Name.LocalName, y => (string)y)
                .ToDictionary(x => x.Key, y => y.FirstOrDefault());
        
    
    public class Envelope
    
        public string messageId  get; set; 
        public DateTime sent  get; set; 
        public string toAddr  get; set; 
        public string fromAddr  get; set; 
        public string system  get; set; 
        public Dictionary<string,string> items  get; set; 
    

【讨论】:

以上是关于LINQ to XML:如何在 C# 中获取元素值?的主要内容,如果未能解决你的问题,请参考以下文章

有没有更快的方法来检查 LINQ to XML 中的 XML 元素?

c# LINQ-to-XML 更新(保存)排序后文件中的元素列表

C# LINQ-to-XML 选择子元素属性最大的元素

Linq to XML - 使用命名空间获取元素

在 C# 中使用 Linq to XML 在文档中搜索不同的 XML 结构

C# Linq to XML 检查元素是不是存在