C# Xdocument Xml 获取元素

C# Xdocument Xml get Element

我有一个 xml 文件,如下所示:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
 <s:Body>
  <GetAllArticlesResponse xmlns="http://www.borger.dk/2009/WSArticleExport/v1">
     <GetAllArticlesResult xmlns:a="http://www.borger.dk/2009/WSArticleExport/v1/types" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
        <a:ArticleDescription>Test 1</a:ArticleDescription>
        <a:ArticleDescription>Test 2</a:ArticleDescription>
      </GetAllArticlesResult>
  </GetAllArticlesResponse>
 </s:Body>
</s:Envelope>

我正在尝试获取所有文章,但无法正常工作。

 XDocument doc = XDocument.Parse(soapResult);
 IEnumerable<XElement> articles = doc.Root.Descendants("a:ArticleDescription");

这之前有工作,但因为元素名称为 : 然后它失败了..

知道如何解决这个问题。

感谢所有意见。

我结束于::

                XNamespace a = "http://www.borger.dk/2009/WSArticleExport/v1/types";
                XDocument doc = XDocument.Parse(soapResult);
                IEnumerable<XElement> articles = doc.Root.Descendants(a + "ArticleDescription");

                List<Article> article = articles.Select(m => new Article()
                {
                    ArticleID = m.Element(a + "ArticleID").Value.ToString(),
                    ArticleTitle = m.Element(a + "ArticleTitle").Value.ToString(),
                    ArticleUrl = m.Element(a + "ArticleUrl").Value.ToString(),
                    LastUpdated = m.Element(a + "LastUpdated").Value.ToString(),
                    PublishingDate = m.Element(a + "PublishingDate").Value.ToString()
                }).ToList();
                json = JsonConvert.SerializeObject(article);

前缀a:是命名空间名称"http://www.borger.dk/2009/WSArticleExport/v1/types"的缩写,可以看到前缀声明的地方

您可以在查询时使用命名空间感知 XName

var descriptions = doc.Root.Descendants(
  XName.Get("ArticleDescription", "http://www.borger.dk/2009/WSArticleExport/v1/types"));

当然你可以将你想要的命名空间存储在变量中,你不必每次都输入它们。

如果不担心冲突,也可以只看本地名称。

var descriptions = doc.Root.Descendants().Where(x => x.Name.LocalName == "ArticleDescription");

这是另一种方法:

var doc = XDocument.Load(xml);

XNamespace ns1 = "http://schemas.xmlsoap.org/soap/envelope/";
XNamespace ns2 = "http://www.borger.dk/2009/WSArticleExport/v1";
XNamespace ns3 = "http://www.borger.dk/2009/WSArticleExport/v1/types";

var result = doc.Element(ns1 + "Envelope")
                    .Element(ns1 + "Body")
                        .Element(ns2 + "GetAllArticlesResponse")
                            .Element(ns2 + "GetAllArticlesResult")
                                .Elements(ns3 + "ArticleDescription")
                                    .Select(x => x.Value);

或者

var doc = XDocument.Load(xml);
var envelope = doc.Root;
var body = (XElement)envelope.FirstNode;
var getAllArticlesResponse = (XElement)body.FirstNode;
var getAllArticlesResult = (XElement)getAllArticlesResponse.FirstNode;
var articleDescriptions = getAllArticlesResult.Nodes().Cast<XElement>();
var result = articleDescriptions.Select(x => x.Value);

这是使用 Xml Linq 的最简单方法:

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

namespace ConsoleApplication137
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            XDocument doc = XDocument.Load(FILENAME);

            string[] description = doc.Descendants().Where(x => x.Name.LocalName == "ArticleDescription").Select(x => (string)x).ToArray();

        }

    } 
}