2011-03-05 34 views
0

我試圖找到一個簡單而流暢的方式來執行以下要求。在C中分析可選標籤#

我有一個XML消息排列如下:

<persons> 
    <person> 
     <firstName>Mike</firstName> 
     <middleName>K.</middleName> 
     <lastName>Kelly</lastName> 
    </person> 
    <person> 
     <firstName>Steve</firstName> 
     <lastName>David</lastName> 
    </person> 
    <person> 
     <firstName>Laura</firstName> 
     <middleName>X.</middleName> 
     <lastName>Xavier</lastName> 
    </person> 
    </persons> 

我想用XPath表達式來解析這個XML。

persons/person/firstName 
persons/person/middleName 
persons/person/lastName 

我的目標是像這樣的店鋪名字,中間名和lastName變量值到這樣的字符串對象的列表:

firstNameList[0] = "Mike"; 
firstNameList[1] = "Steve"; 
firstNameList[2] = "Laura"; 

middleNameList[0] = "K."; 
middleNameList[1] = null; 
middleNameList[2] = "X."; 

lastNameList[0] = "Kelly"; 
lastNameList[1] = "David"; 
lastNameList[2] = "Xavier"; 

在我的C#代碼,我這樣做:

XmlNodeList firstNameNodeList = xmlDoc.SelectNodes("persons/person/firstName", nsmgr); 
XmlNodeList middleNameNodeList = xmlDoc.SelectNodes("persons/person/middleName", nsmgr); 
XmlNodeList lastNameNodeList = xmlDoc.SelectNodes("persons/person/lastName", nsmgr); 

這段代碼的問題在於,對於中間名,我沒有在第二個人在我的XML列表中。因此,middleNameNodeList返回2個值(K.和X.),但我不知道第1或第2或第3個人的中間名是否丟失。

我希望SelectNodes()API將提供一個迭代或索引ID作爲重複元素有一個給定的值。

請給我一個最簡單的方法來實現我所需要的?非常感謝您的幫助,JK

+1

你可以有<中間名/>對於人X」,沒有中間的名字嗎? – 2011-03-05 02:47:07

+0

@StackOverflowException,這是一個很好的想法。在這種情況下,SelectNodes()會在這個例子中返回3個值嗎? K.,null和X.?我需要試驗它。 – JKK 2011-03-05 03:33:01

+0

是的。第二個middleName不會爲空,但是'XmlNodeList'的'InnerXml'將是空白的。看到我的回答:) – 2011-03-05 03:42:53

回答

1

獲取名稱列表,嘗試獲取person s列表,然後迭代列表並獲取其名稱。

0

你只需要遍歷persons/person並分別處理每個 - 這會工作:

XmlDocument xmlDoc = new XmlDocument(); 
xmlDoc.Load(@"test.xml"); 
var persons = xmlDoc.SelectNodes("persons/person"); 
foreach (XmlNode person in persons) 
{ 
    string firstName = person.SelectSingleNode("firstName").InnerText; 
    string middleName = (person.SelectSingleNode("middleName") != null) 
         ? person.SelectSingleNode("middleName").InnerText 
         : null; 
    string lastName = person.SelectSingleNode("lastName").InnerText; 
} 
2

這個怎麼樣?

foreach (Node person in xmlDoc.SelectNodes("persons/person", nsmgr)) 
{ 
    firstNameNodeList.Add(person.SelectSingleNode("firstName", nsmgr)); 
    middleNameNodeList.Add(person.SelectSingleNode("middleName", nsmgr)); 
    lastNameNodeList.Add(person.SelectSingleNode("lastName", nsmgr)); 
} 
+0

我剛剛給出了示例XML來解釋這個問題,但是在我的真實系統中,我會用xpaths預定義一個複雜的重複標記元素。所以我不知道單個標籤名稱,只有XPath表達式。我想盡可能通用。任何其他想法? – JKK 2011-03-05 03:14:17

+0

@JKK:沒有保證節點列表是有序的。你不能假設,假設所有節點列表中的第三個元素屬於同一個「人」。所以Jollymorphic的上述答案就是要走的路。 – muratgu 2011-03-05 19:30:14

0

嘗試

<persons> 
    <person> 
     <firstName>Mike</firstName> 
     <middleName>K.</middleName> 
     <lastName>Kelly</lastName> 
    </person> 
    <person> 
     <firstName>Steve</firstName> 
     <middleName /> 
     <lastName>David</lastName> 
    </person> 
    <person> 
     <firstName>Laura</firstName> 
     <middleName>X.</middleName> 
     <lastName>Xavier</lastName> 
    </person> 
    </persons> 

<person> 
    <firstName>Steve</firstName> 
    <middleName /> 
    <lastName>David</lastName> 
</person> 

,應返回 「K」, 「」, 「爲InnnerText