2014-01-17 52 views
0

在我的應用程序中,如果用戶輸入另一個文本框中的某個數字(例如:textbox1中的用戶類型),我想要在文本框中顯示xml節點的顯示值數字「123」。應用程序應該檢查xml是否存在「123」,然後獲取其他節點的值)。但是xml文件沒有修復。它由應用程序本身創建(用戶在文本框中鍵入的內容)。獲取xml節點值嘗試使用SelectSingleNode和SelectNodes使用c#

過了幾個小時我仍然沒有明白。這聽起來很簡單(我確信你的大部分都是這樣),但我是c#中的一個大新手。所以我搜索了很多,最後找到SelectSingleNodeSelectNodes。首先,我想這代碼:

private void txtKNrNew_Leave(object sender, EventArgs e) 
{ 
    XDocument xdoc = XDocument.Load(path + "\\save.xml"); 
    int CustNos; 

    if (Int32.TryParse(txtKNrNew.Text, out CustNos)) 
    { 
     XmlDocument xmlDoc = new XmlDocument(); 
     xmlDoc.Load(path + "\\save.xml"); 

     var xmlNodeExist = "Buchhaltung/Customers/CustNo"; 
     var CustNoExist = xdoc.XPathSelectElements(xmlNodeExist).FirstOrDefault(x => (int)x == CustNos); 

     var SurnameNode = xmlDoc.SelectSingleNode("Buchhaltung/Customers/Surname"); 
     var ForenameNode = xmlDoc.SelectSingleNode("Buchhaltung/Customers/Forename"); 
     string surname = SurnameNode.InnerText; 
     string forename = ForenameNode.InnerText; 

     if (CustNoExist != null) 
     { 
      txtSurnameNew.Text = surname; 
      txtForenameNew.Text = forename; 
     } 
    } 
} 

這總是返回我的第一個XML節點的值(這裏:「東西」和「物」在最後,你可以看到XML文件)。所以,我嘗試使用SelectNodes

private void txtKNrNew_Leave(object sender, EventArgs e) 
{ 
    XDocument xdoc = XDocument.Load(path + "\\save.xml"); 
    int CustNos; 

    if (Int32.TryParse(txtKNrNew.Text, out CustNos)) 
    { 
     XmlDocument xmlDoc = new XmlDocument(); 
     xmlDoc.Load(path + "\\save.xml"); 

     var xmlNodeExist = "Buchhaltung/Customers/CustNo"; 
     var CustNoExist = xdoc.XPathSelectElements(xmlNodeExist).FirstOrDefault(x => (int)x == CustNos); 

     var SurnameNode = xmlDoc.SelectNodes("Buchhaltung/Customers/Surname"); 
     var ForenameNode = xmlDoc.SelectNodes("Buchhaltung/Customers/Forename"); 
     string surname = SurnameNode[0].InnerText; 
     string forename = ForenameNode[0].InnerText; 

     if (CustNoExist != null) 
     { 
      txtSurnameNew.Text = surname; 
      txtForenameNew.Text = forename; 
     } 
    } 
} 

這將返回我一樣的另一種。我知道,因爲我使用[0]。所以[]中的數字不應該被修正。但有沒有辦法做到這一點不固定?哪種方法是更好的方法呢?我怎樣才能像我想要的那樣正確地獲取值?

有人可以幫我或給我一個提示嗎?

感謝, 泰勒

PS:在這裏你可以看到我的生成的XML文件:

<Buchhaltung> 
    <Customers> 
    <CustNo>123</CustNo> 
    <Surname>Stuff</Surname> 
    <Forename>Thing</Forename> 
    <Addr>Addr</Addr> 
    <Zip>Zip</Zip> 
    <Place>Place</Place> 
    <Phone>Phone</Phone> 
    <Mail>Mail</Mail> 
    </Customers> 
    <Customers> 
    <CustNo>137</CustNo> 
    <Surname>Other</Surname> 
    <Forename>Name</Forename> 
    <Addr>Address</Addr> 
    <Zip>12345</Zip> 
    <Place>New York</Place> 
    <Phone>1234567890</Phone> 
    <Mail>[email protected]</Mail> 
    </Customers> 
</Buchhaltung> 

回答

1

您可以使用以下XPath表達式:

var expression = String.Format("//Customers[CustNo/text() = {0}]/", CustNos); 

var SurnameNode = xmlDoc.SelectNodes(expression + "Surname"); 
var ForenameNode = xmlDoc.SelectNodes(expression +"Forename"); 
+0

感謝您的答案。你能解釋我的第一行嗎?我不明白 – Tyler

+0

這是XPaht表達式,它表示:查找包含具有==到CustNo變量值([CustNo/text()= 123])的子元素CustNo的任何Customers元素(// Customers)) 。然後我連接「姓氏」和「姓氏」以獲得找到的客戶元素的正確子元素。我原來的帖子出錯了,但我現在已經更正了。 –

+0

你可以在這裏測試你的XPath表達式:http://www.xpathtester.com/test –

1

您可以使用LINQ2XML

XDocument doc=XDocument.Load(path); 
var node=doc.Elements("Customers") 
      .SingleOrDefault(x=>x.Element("CustNo").Value==CustNos.ToString()); 
if(node!=null) 
{ 
    txtSurnameNew.Text=node.Element("Surname").Value; 
    txtForenameNew.Text=node.Element("Forename").Value; 
} 
+0

感謝您的回答。如果我使用這段代碼,我在'txtSurnameNew.Text ='處得到了這個錯誤信息:'對象引用沒有設置爲對象的一個​​實例' – Tyler

0

怎麼樣:

XmlDocument xmlDoc = new XmlDocument(); 
xmlDoc.Load(path + "\\save.xml"); 

var xmlNodeExist = "Buchhaltung/Customers/CustNo"; 
var CustNoExist = xdoc.XPathSelectElements(xmlNodeExist).FirstOrDefault(x => (int)x == CustNos); 

var SurnameNode = xmlDoc.SelectNodes("Buchhaltung/Customers/Surname"); 
var ForenameNode = xmlDoc.SelectNodes("Buchhaltung/Customers/Forename"); 

if (CustNoExist != null) 
{ 
    foreach(XmlNode xn in SurnameNode) 
    { 
     txtSurnameNew.Text += xn.InnerText + Environment.Newline; 
    } 

    foreach(XmlNode xn in ForenameNode) 
    { 
     txtForenameNew.Text += xn.InnerText + Environment.Newline; 
    } 
} 

希望能幫助你。託比

+0

這是行不通的,因爲我不能使用'Newline'並且是'xdoc '和'同時xmlDoc'和'xdoc'沒有定義 – Tyler

+0

然後可以使用: 的foreach(在SurnameNode XmlNode的xn)映射 { txtSurnameNew.Text + = xn.InnerText + 「」; } foreach(ForenalNode中的XmlNode xn) { txtForenameNew.Text + = xn.InnerText +「,」; } 「xdoc」來自你的代碼:) – Toby

+0

恩,這也行不通:/我得到這個錯誤:'參考沒有設置爲對象的實例' – Tyler