2013-06-03 27 views
7

我想從XML文件中獲取值,但是失敗了。你能幫我指出問題嗎?因爲我已經很努力地測試和谷歌搜索,但我仍然無法發現問題。C#XmlDocument SelectNodes不起作用

XML:

<?xml version="1.0" encoding="utf-8" ?> 
<Contacts> 
    - <Contact> 
    <ID>xxx</ID> 
     <AutoUpdateEnabled>false</AutoUpdateEnabled> 
     <LastChanged>2013-05-29T01:53:59.4470000Z</LastChanged> 
    - <Profiles> 
     - <Personal> 
       <FirstName>My First Name</FirstName> 
       <LastName>My Last Name</LastName> 
       <UniqueName>My Unique Name</UniqueName> 
       <SortName></SortName> 
       <DisplayName>My Display Name</DisplayName> 
      </Personal> 
    </Profiles> 
    - <Phones> 
     - <Phone> 
      <ID>3</ID> 
      <PhoneType>Mobile</PhoneType> 
      <Number>000-0000000</Number> 
      <IsIMEnabled>false</IsIMEnabled> 
      <IsDefault>false</IsDefault> 
      </Phone> 
    </Phones> 
    - <Locations> 
     - <Location> 
       <ID>2</ID> 
       <LocationType>Business</LocationType> 
       <CompanyName></CompanyName> 
       <IsDefault>false</IsDefault> 
      </Location> 
     </Locations> 
</Contact> 
- <Contact> 
    <ID>xxx</ID> 
    <AutoUpdateEnabled>false</AutoUpdateEnabled> 
    <LastChanged>2013-05-29T01:53:25.2670000Z</LastChanged> 
    - <Profiles> 
     - <Personal> 
       <FirstName>Person</FirstName> 
       <LastName>Two</LastName> 
       <UniqueName></UniqueName> 
       <SortName></SortName> 
       <DisplayName>Person Two</DisplayName> 
      </Personal> 
     </Profiles> 
    - <Emails> 
     - <Email> 
       <ID>1</ID> 
       <EmailType>Personal</EmailType> 
       <Address>[email protected]</Address> 
       <IsIMEnabled>false</IsIMEnabled> 
       <IsDefault>true</IsDefault> 
      </Email> 
     </Emails> 
    - <Locations> 
     - <Location> 
       <ID>2</ID> 
       <LocationType>Business</LocationType> 
       <CompanyName>Testing Company</CompanyName> 
       <IsDefault>false</IsDefault> 
      </Location> 
     </Locations> 
    </Contact> 
</Contacts> 

我的示例代碼:

XmlDocument xmldoc = new XmlDocument(); 
xmldoc.LoadXml("TheXMLFile.xml"); 

xmldoc.DocumentElement.SelectNodes("contact") // return 0 counts 
xmldoc.DocumentElement.SelectNodes("/contact") // return 0 counts 
xmldoc.DocumentElement.SelectNodes("/contact") // return 0 counts 
xmldoc.DocumentElement.SelectNodes("/contacts/contact") // return 0 counts 
xmldoc.DocumentElement.SelectNodes("*") // return 2 counts !this works 

XmlNodeList elemList = xmldoc.DocumentElement.GetElementsByTagName("contact"); // return 2 counts !this also works 
foreach (XmlNode node in elemList) 
{  
    node.SelectSingleNode("Profiles") //return "" 
    node.SelectSingleNode("/Profiles") //return "" 
    node.SelectSingleNode("//Profiles") //return "" 
    node.SelectSingleNode(".//Profiles") //return "" 
} 

我只是想獲得 「名字,姓氏,電子郵件地址」 中,SelectNodes功能只是不工作像預期的...沒有一切線索...請幫助。在此先感謝

回答

10

你需要的東西是這樣的:

XmlDocument xmldoc = new XmlDocument(); 
xmldoc.Load(@"D:\temp\contacts.xml"); // use the .Load() method - not .LoadXml() !! 

// get a list of all <Contact> nodes 
XmlNodeList listOfContacts = xmldoc.SelectNodes("/Contacts/Contact"); 

// iterate over the <Contact> nodes 
foreach (XmlNode singleContact in listOfContacts) 
{ 
    // get the Profiles/Personal subnode 
    XmlNode personalNode = singleContact.SelectSingleNode("Profiles/Personal"); 

    // get the values from the <Personal> node 
    if (personalNode != null) 
    { 
     string firstName = personalNode.SelectSingleNode("FirstName").InnerText; 
     string lastName = personalNode.SelectSingleNode("LastName").InnerText; 
    } 

    // get the <Email> nodes 
    XmlNodeList emailNodes = singleContact.SelectNodes("Emails/Email"); 

    foreach (XmlNode emailNode in emailNodes) 
    { 
     string emailTyp = emailNode.SelectSingleNode("EmailType").InnerText; 
     string emailAddress = emailNode.SelectSingleNode("Address").InnerText; 
    } 
} 

通過這種方法,你應該能夠讀取所有你需要正確的數據。

+0

我可以使用foreach循環爲「聯繫」,然後在循環內選擇一個電子郵件? – user2402624

+0

@ user2402624:如果你只想要一個電子郵件(可能是多個) - 是的,你可以做到這一點。 –

+1

我知道這是一箇舊帖子,但是從我所看到的情況來看,如果要從XMLNodeList(使用Xpath語句)選擇節點,LoadXML將不起作用。我得到了相同的結果 - 0無論我如何安排Xpath。有沒有解決這個錯誤? – MC9000

0

XML標籤與案例相關,因此請聯繫!=聯繫人。

改變這一開始。