2012-07-30 40 views
-2

可能重複:
Parsing XML String in C#難度在XML的解析在C#

如何處理下面XML文件和元件值存儲在數組中

<UserID> 
    <Total>2</Total> 
    <X1>2</X1> 
    <Y1>4</Y1> 
    <Attached1>2,3,4</Attached1> 
    <X2>7</X2> 
    <Y2>8</Y2> 
    <Attached2>4,5,6</Attached2> 
    </UserID> 

在這裏我需要解析元素X1和X2並將它們存儲在同一個數組中。

同樣,我需要解析元素Y1,Y2和Attached1,Attached2並將它們存儲在同一個數組中。

該文件可能會動態增長或減少。

我們可以將X1,X2直到X100元素或X1,X2直到X10元素。

我不希望它被限制爲少數元素。

這裏總元件表示可以有兩個X元素如X1和X2

如果總的值是5,然後可以有5 X元素如X1,X2,X3,X4和X5。

我需要動態解析和存儲這些值。

任何幫助?

+0

它不是一個重複的問題。我的問題完全不同。 – 2012-07-30 07:11:20

回答

1

我不得不說,在文檔的設計是壞的。你不應該指出你的元素來表明它們的位置。只要給他們一個普通的名字並添加儘可能多的你需要的。

這樣說,在你的情況下,你可以生成名稱(假設它們將始終是連續的)。

var xmlStr = @"<UserID> 
    <Total>2</Total> 
    <X1>2</X1> 
    <Y1>4</Y1> 
    <Attached1>2,3,4</Attached1> 
    <X2>7</X2> 
    <Y2>8</Y2> 
    <Attached2>4,5,6</Attached2> 
</UserID> 
"; 
var doc = XDocument.Parse(xmlStr); 
var users = 
    from user in doc.Descendants("UserID") 
    let total = (int)user.Element("Total") 
    select new 
    { 
     X = Enumerable.Range(1, total) 
         .Select(i => (int)user.Element("X" + i)) 
         .ToArray(), 
     Y = Enumerable.Range(1, total) 
         .Select(i => (int)user.Element("Y" + i)) 
         .ToArray(), 
     Attached = Enumerable.Range(1, total) 
          .Select(i => (string)user.Element("Attached" + i)) 
          .ToArray(), 
    }; 
+0

我同意Jeff的觀點,那就是你的LINQ表達式變得乾淨並且寫起來變得更容易。 – Codehelp 2012-07-30 07:27:10

+0

謝謝,這正是我正在尋找的 – 2012-07-30 09:43:14

1

使用XmlDocument.SelectNodesXPath

XmlDocument document = new XmlDocument(); 
document.LoadXml("yourFile"); 

List<string> first = (from XmlNode node in document.SelectNodes("//X1 | //X2") 
        select node.Value).ToList(); 
List<string> second = (from XmlNode node in document.SelectNodes("//Y1|//Y2|//Attached1|//Attached2") 
         select node.Value).ToList();