2012-06-27 61 views
3

我有以下XML,我想在我的C#代碼中解析。但是,我不知道應該怎麼做。如何解析C#中沒有特定標籤名稱的XML

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<results> 
    <fields> 
    <field>COLUMN_NAME_1</field> 
    <field>COLUMN_NAME_2</field> 
    <field>COLUMN_NAME_3</field> 
    <field>COLUMN_NAME_4</field> 
    </fields> 
    <rows> 
    <row> 
     <col>value_for_column_1</col> 
     <col>value_for_column_2</col> 
     <col>value_for_column_3</col> 
     <col>value_for_column_4</col> 
    </row> 
    <row> 
     <col>value_for_column_1</col> 
     <col>value_for_column_2</col> 
     <col>value_for_column_3</col> 
     <col>value_for_column_4</col> 
    </row> 
    ... 
    </rows> 
</results> 

這只是一個例子,因爲我無法提供真實的數據。 XML的結構看起來完全一樣。 「COLUMN_NAME_」和「value_for_column_」由字符串表示。如果你能幫助我,我會非常感激。

+0

創建模式(xsd)模板以驗證此模板並使用XmlValidatingReader類.net來驗證它。 –

+0

@羅米爾不確定在這裏真的實現了多少... –

回答

1

首先,創建一個xml document obect。然後獲取根節點,然後訪問您的自定義節點。

XmlDocument doc = new XmlDocument(); 
    doc.Load(fileName); 
    XmlNode root = doc.DocumentElement; 
    XmlNode s = root.SelectSingleNode('/' + rootName + '/' + section); 
-1

下面是做到這一點的simpliest方式:

private static void Main() 
{ 
     const string xml = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?> <results> ... </results>"; 
     XmlDocument doc = new XmlDocument(); 

     doc.LoadXml(xml); 
     var fieldsCollection = doc.GetElementsByTagName("fields"); 
     var rowsCollection = doc.GetElementsByTagName("rows"); 
} 
+0

OP說他不知道標籤名稱 –

+0

「XML的結構看起來完全一樣。」 - 這是表單主題 –

+0

標題「如何在C#中沒有特定標記名稱的情況下解析XML」 –

0

XmlDocument看看,你可以在ChildNodes財產遞歸迭代。

例如

void Recurse(XmlNodeList list) 
{ 
    foreach(XmlNode node in list) 
    { 
     // Do some work 
     Recurse(node.ChildNodes); 
    } 
} 
0

正如其他人指出,XmlDocument是讀取這種文件最舒適的方式之一。你可以遍歷節點與foreach,你可以運行XPath查詢等等。

我只想補充,在這種情況下,XML文件是非常大的(因此是不切實際的讀取它在內存中),有一個XmlReader類,它允許您從頭到尾順序讀取XML文件,只保留一小部分內存。

0

通過以下,我們可以得到場元素和行元素:

  • node.FirstNode - 獲取父
  • node.NextNode的第一個子節點 - 獲取下一個兄弟節點

加載xml並初始化列列表。

XElement root = XElement.Load(file); // or .Parse(string); 
List<List<string>> columns = new List<List<string>>(); 

獲取列標題:

XElement fields = (XElement)root.FirstNode; 
fields.Elements().Select((x, i) => 
{ 
    columns.Add(new List<string>()); 
    columns[i].Add((string)x); 
    return true; // because a select has to return something 
}).ToArray(); 

然後得到行:然後

XElement rows = (XElement)fields.NextNode; 
rows.Elements().ToList().ForEach(row => 
    row.Elements().Select((x, i) => 
    { 
     columns[i].Add((string)x); 
     return true; 
    }).ToArray()); 

列列表將包含標題後經柱排序的所有行。

PS我需要.ToArray()'s進行測試,您可能不需要它們在您的項目中。