如何解析XML后代元素子树

时间:2018-07-05 08:11:56

标签: c# xml parsing

此XML有点不同, 每个节点最初都是<dp41:nnnnn(即它们的类型),并且':'无效,因此我删除了这些节点,保留了该节点。 解析它时,它将返回整个元素和子树。 因此,问题是如何从此xml获取元素(节点)。 使用的代码将整个子树和指定的父节点作为一个元素返回 即 来自(包括).. VehicleValueInfo ... +中的所有元素以及关闭标记VehicleValueInfo /> 通缉的是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://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 :(得分:1)

尝试一下

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

答案 1 :(得分:0)

您必须使用xml.Elements而不是xml.Descendants

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

后代返回起始元素下的所有树

Elements返回起始元素的所有直接子元素

答案 2 :(得分:0)

如果不需要名称空间,这可能是一个解决方案:

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位的格式不正确。我想这里缺少名称空间前缀声明...