2015-11-03 67 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> 

,並得到這個輸出與以上代碼:

要保留OPERATION節點,您可以刪除El對此語句()這樣的:

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有兩全其美的
(實際上有三個世界的位置:對象/字符串和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

你想保留。或者是否希望在操作持有模型,子模型信息中擁有所有信息? –

+0

我想保留每個標籤,包括等,以及您的第一個解決方案給出的所有信息。 –