Как разобрать поддерево элементов XML Потомки - PullRequest
0 голосов
/ 05 июля 2018

Этот XML немного отличается, Каждый узел изначально был <dp41:nnnnn (то есть их тип), а ':' недопустим, поэтому я удалил их, оставив это. При синтаксическом анализе он возвращает весь элемент и поддерево. Итак, вопрос в том, как получить элементы (узлы) из этого xml. Используемый код возвращает все поддерево и указанный родительский узел как один элемент то есть из (включая) .. VehicleValueInfo ... + все элементы внутри и закрывающий тег VehicleValueInfo /> Требуются дочерние элементы VehicleValue'node.

XML:

<?xml version="1.0" encoding="UTF-8"?>
    <s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope">
        <s:Body>
            <GetConvergedDataRequestResponse xmlns="http://autoi.trnsn.co.za/types" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
                <ConvergedData i:type="d4p1:ConvergedResults" xmlns:="http://schemas.datacontract.org/2004/07/Trnsn.Auto.Convergence.B2B.BusinessModels">
                    <AccidentHistory i:nil="true"/>
                    <AlertInfo i:nil="true"/>
                    <CloneInfo i:nil="true"/>
                    <DiskDriveInfo>
                        <ResultCode i:nil="true"/>
                        <ResultCodeDescription i:nil="true"/>
                       <AirbagDetails>DRIVER, PASSENGER</AirbagDetails>
                    </DiskDriveInfo>
                    <EnquiryHistory i:nil="true"/>
                        <VehicleValueInfo>
                            <VehicleValue>
                            <ResultCode i:nil="true"/>              
                            <AdjCostPrice>0</AdjCostPrice>
                            <VehicleCode>60007400</VehicleCode>
                        </VehicleValue>
                    </VehicleValueInfo>

Код есть;

XNamespace ns = "http://autoi.trnsn.co.za/types";
var xml = XDocument.Parse(InXML);
foreach (XElement element in xml.Descendants("{" + ns + "}VehicleValue"))
{
    Console.WriteLine(element.ToString());
};

Выводом независимо от потомков, элементов или foreach в пределах первого foreach остается целое дерево. который (полностью):

<VehicleValue xmlns="http://autoinsight.transunion.co.za/types">
   <ResultCode i:nil="true" xmlns:i="http://www.w3.org/2001/XMLSchema-instance" />
  <ResultCodeDescription i:nil="true" xmlns:i="http://www.w3.org/2001/XMLSchema-instance" />
      <AdjCostPrice>0</AdjCostPrice>
       ..
       ..
      <VehicleCode>60007400</VehicleCode>
</VehicleValue>

Я добавляю весь необходимый только XML сюда

<?xml version="1.0" encoding="UTF-8"?>
-<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope"
   -<s:Body>
      -<GetConvergedDataRequestResponse xmlns="http://autoinsight.trann.co.za/types" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">

          -<ConvergedData i:type="ConvergedResults" xmlns:d4p1="http://schemas.datacontract.org/2004/07/Trann.Auto.Convergence.B2B.BusinessModels">
               <AccidentHistory i:nil="true"/>
               <AlertInfo i:nil="true"/> 
               <CloneInfo i:nil="true"/>
               -<DiskDriveInfo>
                    <ResultCode i:nil="true"/>
                    <ResultCodeDescription i:nil="true"/>
                    <AirbagDetails>DRIVER, PASSENGER</AirbagDetails>
                    <Alarm>NO</Alarm>
                </DiskDriveInfo>
                <EnquiryHistory i:nil="true"/>
                <FactoryFittedExtras i:nil="true"/>
                <Finance i:nil="true"/>
                <MileageHistory i:nil="true"/>
                -<VehicleCodeAndDescription>
                    <ResultCode i:nil="true"/>
                    <ResultCodeDescription i:nil="true"/>
                    <VehicleCode>60007400</VehicleCode>
                </VehicleCodeAndDescription>
                <VehicleConfirmationInfo i:nil="true"/>
               -<VehicleValueInfo>
                   -<VehicleValue>
                        <ResultCode i:nil="true"/>
                        <ResultCodeDescription i:nil="true"/>
                        <AdjustCostPrice>0</AdjustCostPrice>
                        <AdjEstCostPrice>0</AdjEstCostPrice>
                        <CostPrice>0</CostPrice>
                        <TradePrice>0</TradePrice>
                        <VehicleCode>60007400</VehicleCode>
                   </VehicleValue>
              </VehicleValueInfo>
              <VesaInfo i:nil="true"/>
         </ConvergedData>

         <ResponseStatus xmlns:d4p1="http://schemas.servicestack.net/types" i:nil="true"/>

      </GetConvergedDataRequestResponse>
   </s:Body>
</s:Envelope>

Ответы [ 3 ]

0 голосов
/ 05 июля 2018

Попробуйте это

XNamespace ns = "http://autoi.trnsn.co.za/types";
var xml = XDocument.Parse(InXML);
foreach (XElement element in xml.Descendants(ns + "VehicleValue"))
{
   foreach(XElement ele in element.Elements())
   {
       Console.WriteLine((string)ele);
   }
};​
0 голосов
/ 05 июля 2018

Если вам не нужны пространства имен, это может быть решением:

var xml = XDocument.Parse(InXML);
xml.RemoveNamespace();

foreach (XElement element in xml.Descendants("VehicleValue").Elements())
{
    Console.WriteLine(element.ToString());
};

Где RemoveNamespace():

public static void RemoveNamespace(this XContainer pContainer)
{
    pContainer.Descendants().Attributes().Where(x => x.IsNamespaceDeclaration).Remove();

    foreach (var element in pContainer.Descendants())
        element.Name = element.Name.LocalName;
}

Кстати, кажется, что xml искажен в строке 5, позиции 69. Я предполагаю, что отсутствует объявление префикса пространства имен ...

0 голосов
/ 05 июля 2018

Вы должны использовать xml.Elements вместо xml.Descendants

var xml = XDocument.Parse(InXML);
foreach (XElement element in xml.Elements("VehicleValue"))
{
    Console.WriteLine(element.ToString());
};

Потомки возвращают все дерево под начальным элементом

Элементы возвращают все прямые дочерние элементы начального элемента

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...