2013-06-03 29 views
7

Tôi muốn lấy giá trị từ tệp XML nhưng không thành công. Bạn có thể vui lòng giúp tôi chỉ ra vấn đề không ?? Bởi vì tôi đã cố gắng rất nhiều để thử nghiệm và googling nhưng tôi vẫn không thể phát hiện vấn đề.C# XmlDocument SelectNodes không hoạt động

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> 

My Sample Code:

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 "" 
} 

Tôi chỉ muốn để có được "FirstName, LastName, Địa chỉ Email", các SelectNodes chức năng chỉ không làm việc như mong đợi ... Không đầu mối ở tất cả ... xin vui lòng giúp đỡ. Cảm ơn trước

Trả lời

10

Bạn cần một cái gì đó như thế này:

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; 
    } 
} 

Với phương pháp này, bạn sẽ có thể đọc tất cả các dữ liệu bạn cần đúng cách.

+0

tôi có thể sử dụng vòng lặp foreach cho "Liên hệ" và sau đó chọn một email duy nhất trong vòng lặp ?? – user2402624

+0

@ user2402624: nếu bạn chỉ muốn một e-mail đơn lẻ (có thể nhiều) - có, bạn có thể làm điều đó. –

+1

Tôi biết đây là một bài đăng cũ, nhưng từ những gì tôi có thể thấy, LoadXML không hoạt động nếu bạn muốn SelectNodes từ một XMLNodeList (với các câu lệnh Xpath). Tôi nhận được kết quả tương tự - 0 bất kể tôi đã sắp xếp Xpath như thế nào. Có sửa chữa lỗi này không? – MC9000

0

Các thẻ XML phụ thuộc trường hợp nên liên hệ! = Liên hệ.

Thay đổi điều này để bắt đầu.

Các vấn đề liên quan