Как разобрать XML-файл с помощью Linq Lambda из заданного ключа - PullRequest
0 голосов
/ 04 июля 2018

Я пытаюсь разобрать документ xml с выражением Linq и Lambda, но мне нужна помощь.

Узлом, из которого я хочу получить данные, является «DiskDriveInfo», Я также не уверен, как перейти к следующему узлу "ResultCode i: nil =" true ""

Мой код:

var xml = XDocument.Parse(InXML);
var r = from x in xml.Elements("DiskDriveInfo")
                select new
                {
                    ResultCode = x.Element("ResultCode").Value,
                    ResultCodeDescription = 
                          x.Element("ResultCodeDescription").Value,
                    AirbagDetails = x.Element("AirbagDetails").Value,
                    ..
                    ..
                    WheelBase        = x.Element("WheelBase").Value              
};

и ввод:

<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope">
  <s:Body>
    <GetConvergedDataRequestResponse xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://autoinsight.trn.co.za/types">
      <ConvergedData xmlns:d4p1="http://schemas.datacontract.orgB2B.BusinessModels" i:type="ConvergedResults">
        <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>
...
...
<WheelBase>2460</WheelBase>
    </DiskDriveInfo>

Thx

Ответы [ 2 ]

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

Вы можете написать снизу код, просто вам нужно создать класс в соответствии с вашим XML-файлом, а ниже находится функция для непосредственного преобразования XML в объект класса

    public T DeserializeData(string dataXML)
    {
         XmlDocument xDoc = new XmlDocument();
         xDoc.LoadXml(dataXML);
         XmlNodeReader xNodeReader = new XmlNodeReader(xDoc.DocumentElement);
         XmlSerializer xmlSerializer = new XmlSerializer(typeof(T));
         var modelData = xmlSerializer.Deserialize(xNodeReader);
         T deserializedModel = (T)modelData ;
         return deserializedModel;
    }
0 голосов
/ 04 июля 2018

Здесь есть две проблемы:

  • Ваши элементы находятся в пространстве имен "http://autoinsight.trn.co.za/types", но вы ищете их без указания пространства имен
  • Вы используете xml.Elements, который будет искать только корневые элементы; чтобы искать потомков, вы должны использовать Descendants.

Так что вы, вероятно, хотите:

XNamespace ns = "http://autoinsight.trn.co.za/types";
var xml = XDocument.Parse(InXML);
var r = from x in xml.Descendants(ns + "DiskDriveInfo")
        select new
        {
            ResultCode = x.Element(ns + "ResultCode").Value,
            ResultCodeDescription = x.Element(ns + "ResultCodeDescription").Value,
            AirbagDetails = x.Element(ns + "AirbagDetails").Value,
            ..
            ..
            WheelBase = x.Element(ns + "WheelBase").Value              
        };

Как примечание, я бы, вероятно, не использовал для этого выражение запроса - я бы просто вызвал Select напрямую:

var r = xml
    .Descendants(ns + "DiskDriveInfo")
    .Select(x => new
    {
        ResultCode = x.Element(ns + "ResultCode").Value,
        ResultCodeDescription = x.Element(ns + "ResultCodeDescription").Value,
        AirbagDetails = x.Element(ns + "AirbagDetails").Value,
        ..
        ..
        WheelBase = x.Element(ns + "WheelBase").Value              
    });

Если вам нужен элемент с i:nil="true" для возврата пустого значения вместо пустой строки, я бы добавил метод расширения для XElement:

private static XNamespace SchemaNamespace = "http://www.w3.org/2001/XMLSchema-instance";
public static string ValueOrNull(this XElement element)
{
    XAttribute nil = element.Attribute(SchemaNamespace + "nil");
    return (string) nil == "true" ? null : element.Value;
}

Тогда назовите это так:

XNamespace ns = "http://autoinsight.trn.co.za/types";
var xml = XDocument.Parse(InXML);
var r = from x in xml.Descendants(ns + "DiskDriveInfo")
        select new
        {
            ResultCode = x.Element(ns + "ResultCode").ValueOrNull(),
            ResultCodeDescription = x.Element(ns + "ResultCodeDescription").ValueOrNull(),
            AirbagDetails = x.Element(ns + "AirbagDetails").ValueOrNull(),
            ..
            ..
            WheelBase = x.Element(ns + "WheelBase").ValueOrNull()             
        };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...