2014-01-15 5 views
0

C#을 처음 접했고 지금 당장 배우겠습니다. 내 문제와 비슷한 것을 찾을 수 없으므로 여기에 왔습니다.XML 노드에 이미 XML 노드 값이 있는지 확인하십시오. C#

고객을 추가하는 애플리케이션이 있습니다 (최종 단계에 있음). 모든 고객은 XML 파일에 저장됩니다. 모든 고객이 새로운 고객 번호를 얻습니다. 내 XML 파일에 CustNo이라는 XmlNode이 있습니다. 이제 사용자가 새 고객을 추가하고 이미 존재하는 번호를 입력하면이 번호가 이미 있음을 알리는 메시지 상자가 나타납니다. 나는이 C# 코드 가지고 :

XDocument xdoc = XDocument.Load(path + "\\save.xml"); 
var xmlNodeExist = String.Format("Buchhaltung/Customers/CustNo"); 
var CustNoExist = xdoc.XPathSelectElement(xmlNodeExist); 

if (CustNoExist != null) 
{ 
    MessageBox.Show("asdf"); 
} 

을 그리고 내 XML 파일은 다음과 같다 :

<Buchhaltung> 
    <Customers> 
     <CustNo>12</CustNo> 
     <Surname>Random</Surname> 
     <Forename>Name</Forename> 
     <Addr>Address</Addr> 
     <Zip>12345</Zip> 
     <Place>New York</Place> 
     <Phone>1234567890</Phone> 
     <Mail>[email protected]</Mail> 
    </Customers> 
    <Customers> 
     <CustNo>13</CustNo> 
     <Surname>Other</Surname> 
     <Forename>Forename</Forename> 
     <Addr>My Address</Addr> 
     <Zip>67890</Zip> 
     <Place>Manhattan</Place> 
     <Phone>0987654321</Phone> 
     <Mail>[email protected]</Mail> 
    </Customers> 
</Buchhaltung> 

을하지만 메시지 상자 항상가 나타납니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

답변

4

XPath가 모두 반환하기 때문에 CustNo 요소는 내용에 상관없이

var myNumber = 12; 
var xmlNodeExist = String.Format("Buchhaltung/Customers/CustNo[. = {0}]", myNumber.ToString()); 

또는 XML에 First 및 LINQ를 사용하여 :

보십시오 다음

var myNumber = 12; 
var xmlNodeExist = "Buchhaltung/Customers/CustNo"; 
var CustNoExist = xdoc.XPathSelectElements(xmlNodeExist).FirstOrDefault(x => (int)x == myNumber); 
+0

답변 해 주셔서 감사합니다. 나는 이것이 약간의 수정으로 작동 할 수 있다고 생각한다. 'myNumber'는 이제 "12"입니다. 그래서 응용 프로그램에서 값이 12 인 고객 번호가 있는지 확인하십시오. 맞습니까? 그리고 가치 "13"은 어떨까요? 아니면 "14"이상? 이것들을 확인하는 방법? – Tyler

+0

'.innerText'를 사용할 수 있다고 생각합니다. 이것이 가능한가? 그렇다면 힌트를 줄 수 있습니까? – Tyler

+0

새로운 고객 번호로 입력 한 번호로 myNumber 변수 값을 변경하십시오. – MarcinJuraszek

1

현재 'CustNo'요소의 존재 여부를 테스트하고 있습니다. XPath 구문에 대해서는 this reference을 참조하십시오.

당신의 XPath는이 같은 말을한다 :

Buchhaltung//Customers[CustNo='12']

말을하는

이 가진 것을 결합 "값 = '12'가와 '의 CustNo'요소를 포함 모든 고객의 요소" 현재 코드 :

+0

노드 값이 "12"인 경우이 솔루션이 작동합니다. 100까지 숫자가 있다면? 그런 다음 이들이 이미 존재하는지 확인해야합니다. – Tyler

1

당신이 CustNo 요소를 선택하기 때문에 당신은 XML이이

var number = textBox1.Text; 
var CustNoExist = xdoc.Descendants("CustNo").Any(x => (string)x == number); 
if(CustNoExist) 
{ 
    MessageBox.Show("asdf"); 
} 
+0

텍스트 상자가 비어 있으면 어떻게됩니까? 그런 다음 아무것도 확인하지 않습니다. – Tyler

+0

당신은 당신의 단추 누르기 또는 무언가에서 그것을하지 않는가 ?? –

+0

방금 ​​예를 든 것입니다. 유효성 확인을해야합니다. 제 직업이 아닙니다. –

0

에 LINQ를 사용할 수 있습니다 그들의 가치에 관계없이.

int custNo = 12; 
var xmlNodeExist = String.Format("Buchhaltung/Customers[CustNo={0}]", custNo); 

그것은 대신 Customers 요소를 선택,하지만 당신은 단지 존재를 확인하고 있기 때문에, 그것은 중요하지 않은입니다 : 이것은 원하는 고객 번호로 필터링합니다.

W3 학교는 좋은 tutorial/reference on XPath 있습니다.

관련 문제