2011-03-05 6 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 

내 목표는이 같은 문자열 개체의 목록에이 같은 가게 firstName을, 가운데 이름과 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

당신이 가질 수있는 <가운데 이름 />에 대한

<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"를 반환해야합니다, "", "X"를 시도? –

+0

@StackOverflowException, 좋은 생각입니다. 이 경우 SelectNodes()는이 예제에서 3 개의 값을 반환합니까? K., null 및 X.? 나는 그것을 실험 할 필요가있다. – JKK

+0

예. 두 번째 middleName은 null이 아니지만'XmlNodeList'의 InnerXml은 비어 있습니다. 내 대답을 참조하십시오 :) –

답변

1

이름 목록을 가져 오는 중, person의 목록을 얻은 다음 목록을 반복하고 이름을 가져 오십시오.

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을 제공했지만 xpath가 미리 정의 된 복잡한 반복 태그 요소를 얻을 수 있습니다. 따라서 개별 태그 이름은 알 수 없으며 XPath 식만 알 수 있습니다. 가능한 한 제네릭을 만들고 싶습니다. 다른 아이디어? – JKK

+0

@ JKK : 노드리스트가 주문 된 보증인이 없습니다. 모든 노드리스트의 세 번째 요소가 같은 "사람"에 속한다고 가정 할 수는 없습니다. 그래서 Jollymorphic에 의한 위의 대답은 갈 길입니다. – muratgu

0

없는 중간 이름을 가진 사람을위한 InnnerText