2015-11-03 3 views
0

Я ищу, чтобы разделить 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, но у меня нигде нет. Мне не нужен общий ответ, как разделить их, готовые вставить отдельные строки.

Благодарим за помощь.

+2

Пожалуйста, покажите пример результата, так что это не является неоднозначным, и люди не теряют поиск в темноте. Являются ли эти ..., которые вы ожидаете увидеть в первой строке и во второй строке? –

+0

Вы * не хотите отделять что-либо, вам нужно * выбрать * узлы операции, используя XPath или LINQ to XML. Вы можете использовать выражение '// OPERATION' XPath для возврата всех рабочих узлов, например, с помощью [XmlDocument.SelectNodes] (https://msdn.microsoft.com/en-us/library/hcebdtae (v = vs.110). ASPX). Если вы используете XDocument, вместо этого вы можете ввести запрос LINQ вместо XPath. –

+0

. К сожалению, каждая операция выглядит так: https://gist.github.com/robbiewoods05/0a50ff5d1905e8f1ff83 Это именно то, что я хотел бы, чтобы каждая строка выглядела как , –

ответ

2

Вы можете использовать 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> 

и получил этот выход с выше код:

Чтобы сохранить узлы ОПЕРАЦИИ, вы можете удалить El ements(), как это:

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> 
3

Я использовал 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); 
} 

С уважением

+0

Это очень близко к тому, что мне нужно, но Я также хотел бы сохранить теги ... есть ли способ сделать это? –

+0

Вы хотите сохранить <МОДЕЛЬ ОПЕРАЦИИ = "PRV" SUBMODEL = "GBR40EDF" VERSION = "4.0" FUNCTION = "EDFCLC" TARGET = "New ...">.или вы хотите получить всю информацию в модели Operation, SubModel Information? –

+0

Я хотел бы сохранить каждый тег, включая , , и т. Д., А также всю информацию, предоставленную вашим первым решением. –