Как перейти к элементу с помощью XDocument с помощью C # - PullRequest
0 голосов
/ 19 сентября 2018

У меня есть XML-файл, который мне нужно прочитать, и у меня возникают проблемы при переходе к определенному элементу, чтобы затем начать анализ дочерних элементов.Элемент, с которого мне нужно начать чтение, - это <MenuCodes>, каков наилучший способ перехода к элементу, а затем начать чтение?

Пример XML-файла

<?xml version="1.0" encoding="UTF-8"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
   <s:Header>
      <ActivityId CorrelationId="8eb2de20-8dff-4460-ffff-866ac948dfab" xmlns="http://schemas.microsoft.com/2004/09/ServiceModel/Diagnostics">b921a5f3-8188-4021-9c6f-416bdf78f629</ActivityId>
   </s:Header>
   <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <GetMenusResponse xmlns="http://www...">
         <GetMenusResult>
            <Header xmlns="http://www...">
               <SessionId>{8CCCED2E-3D44-4200-BBAC-66660CA08692}</SessionId>
               <CorrelationId>{AFFED12-AD36-4A2C-99FE-5E8D7CBC681D}</CorrelationId>
               <TimeStamp>2018-09-14T11:36:21.5123749Z</TimeStamp>
            </Header>
            <ResponseStatus xmlns="http://www...">
               <Status>OK</Status>
            </ResponseStatus>
            <ResponseBody xmlns="http://www...">
               <Refreshed>2018-09-14T11:36:22.0115845Z</Refreshed>
               <Menus>
                  <MenuCodes>
                     <MenuCode Code="AAA/A1" ShortText="Foo">
                        <ValidPrefix Prefix="V" />
                        <ValidPrefix Prefix="D" />
                        <ValidPrefix Prefix="N" />
                     </MenuCode>
                     <MenuCode Code="AAA/A2" ShortText="Foo2">
                        <ValidPrefix Prefix="D" />
                        <ValidPrefix Prefix="N" />
                     </MenuCode>
                   </MenuCodes>
               </Menus>
            </ResponseBody>
         </GetMenusResult>
      </GetMenusResponse>
   </s:Body>
</s:Envelope>   

Ответы [ 2 ]

0 голосов
/ 19 сентября 2018

Пространства имен являются проблемой.Так что не используйте пространство имен.См код одной строки ниже

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

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

            XElement menuCodes = doc.Descendants().Where(x => x.Name.LocalName == "MenuCodes").FirstOrDefault();
        }
    }
}
0 голосов
/ 19 сентября 2018

Вот действительно подробный способ добраться до этого элемента, важный момент, который большинство новичков здесь забывают, это добавить в пространство имен:

var doc = XDocument.Parse(xml);
var soapNs = XNamespace.Get("http://schemas.xmlsoap.org/soap/envelope/");
var otherNs = XNamespace.Get("http://www...");
var menuCodes = doc
    .Element(soapNs + "Envelope")
    .Element(soapNs + "Body")
    .Element(otherNs + "GetMenusResponse")
    .Element(otherNs + "GetMenusResult")
    .Element(otherNs + "ResponseBody")
    .Element(otherNs + "Menus")
    .Element(otherNs + "MenuCodes");
...