Разделить XML на строки

Вопрос:

Я хочу разбить XML-документ на список строк, но я полностью в недоумении.

<RISKCALC-OUT>
<AUTHENTICATION>
<USERID></USERID>
</AUTHENTICATION>
<OPERATION-LIST>
<OPERATION MODEL="PRV" SUBMODEL="GBR40EDF" VERSION="4.0" FUNCTION="EDFCLC" TARGET="New Platform">
.......
</OPERATION>
<OPERATION MODEL="PRV" SUBMODEL="GBR40EDF" VERSION="4.0" FUNCTION="EDFCLC" TARGET="New Platform">
.....
</OPERATION>
</OPERATION-LIST>
</RISKCALC-OUT>

Я пытаюсь разбить этот файл на строки, так что все под первым операционным узлом находится в одной строке, а затем все под вторым операционным узлом находится во второй строке.

Я играл с XmlNodeLists, но у меня нигде нет. Мне не нужен общий ответ, как разделить их, готовые вставить отдельные строки.

Спасибо за вашу помощь.

Лучший ответ:

Вы можете использовать LINQ для XML следующим образом:

static void Main(string[] args)
{
    string path = "XMLFile1.xml";
    XDocument xdoc = XDocument.Load(path);
    var ops = xdoc.Descendants("OPERATION")
        .Elements()
        .Select(n => n.ToString())
        .ToList<string>();

    ops.ForEach(s => Console.WriteLine(s));
}

Я использовал этот образец XML (добавленный случайный материал для целей тестирования):

<RISKCALC-OUT>
  <AUTHENTICATION>
    <USERID></USERID>
  </AUTHENTICATION>
  <OPERATION-LIST>
    <OPERATION MODEL="PRV" SUBMODEL="GBR40EDF" VERSION="4.0" FUNCTION="EDFCLC" TARGET="New Platform">
      <SUBNODES ID="1">
        <ANOTHER ID="56"></ANOTHER>
      </SUBNODES>
    </OPERATION>
    <OPERATION MODEL="PRV" SUBMODEL="GBR40EDF" VERSION="4.0" FUNCTION="EDFCLC" TARGET="New Platform">
      <SUBNODES ID="1">
        <ANOTHER ID="65"></ANOTHER>
      </SUBNODES>
    </OPERATION>
  </OPERATION-LIST>
</RISKCALC-OUT>

и получил этот результат с указанным выше кодом:

<SUBNODES ID="1">
  <ANOTHER ID="56"></ANOTHER>
</SUBNODES>
<SUBNODES ID="1">
  <ANOTHER ID="65"></ANOTHER>
</SUBNODES>

Чтобы сохранить узлы OPERATION, вы можете удалить Elements() следующим образом:

var ops = xdoc.Descendants("OPERATION")
            .Select(n => n.ToString())
            .ToList<string>();

который будет производить

<OPERATION MODEL="PRV" SUBMODEL="GBR40EDF" VERSION="4.0" FUNCTION="EDFCLC" TARGE
T="New Platform">
  <SUBNODES ID="1">
    <ANOTHER ID="56"></ANOTHER>
  </SUBNODES>
</OPERATION>
<OPERATION MODEL="PRV" SUBMODEL="GBR40EDF" VERSION="4.0" FUNCTION="EDFCLC" TARGE
T="New Platform">
  <SUBNODES ID="1">
    <ANOTHER ID="65"></ANOTHER>
  </SUBNODES>
</OPERATION>

Ответ №1

Я бы использовал LinQ для Xml.
Обслуживание проще.

XElement xmla = XElement.Load("input.xml");
var results = from operationList in xmla.Descendants("OPERATION")
select operationList.Value;
foreach (var result in results)
{
Console.WriteLine(result);
}

EDIT, чтобы иметь лучшее из обоих миров
(На самом деле здесь три мира: Object/String и XML)

Класс для хранения данных:

class Operation
{
public String Model { get; set; }
public String SubModel { get; set; }
// and so on ...

public String TagContent { get; set; }
public String FullTag{ get; set; }
}

Сделайте запрос linq:

XElement xmla = XElement.Load("input.xml");
var operations = from operation in xmla.Descendants("OPERATION")
select new Operation
{
Model = operation.Attribute("MODEL").Value,
SubModel = operation.Attribute("SUBMODEL").Value,
TagContent = operation.Value,
FullTag = operation.ToString(),

};
foreach (var operation in operations)
{
Console.WriteLine(operation.Model + " - " + operation.SubModel+ " - " + operation.TagContent " - " + operation.FullTag);
}

С уважением

Оцените статью
TechArks.Ru
Добавить комментарий