簡體   English   中英

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

這之前有工作,但是因為元素名稱為 a: 那么它失敗了..

任何想法如何解決這個問題。

感謝所有輸入。

我結束了::

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

        }

    } 
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM