C # Xdocument Xml получить элемент - PullRequest
0 голосов
/ 22 октября 2019

У меня есть 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");

Раньше это работало, но потому что имя элемента как: то не получается ..

Любая идея, как это исправить.

Спасибо за все входные данные.

Iзакончился ::

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

Ответы [ 3 ]

0 голосов
/ 22 октября 2019

Вот альтернативный способ:

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);
0 голосов
/ 22 октября 2019

Вот самый простой способ использования 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();

        }

    } 
}
0 голосов
/ 22 октября 2019

Префикс 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");
...