C# XmlDocument SelectNodes 不工作

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/16889895/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-10 08:03:17  来源:igfitidea点击:

C# XmlDocument SelectNodes is not working

c#xmlselectnodes

提问by user2402624

I want to get the value from XML file but I failed. Can you please help me point out the problem ?? Because I already tried very hard to test and googling but I still can't spot the problem.

我想从 XML 文件中获取值,但失败了。你能帮我指出问题吗??因为我已经非常努力地测试和谷歌搜索,但我仍然无法发现问题。

XML :

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

I just want to get "FirstName, LastName, Email Address", the SelectNodesfunction just not working like expected... No clue at all ... please help. Thanks in advance

我只想得到“名字,姓氏,电子邮件地址”,该SelectNodes功能无法按预期工作......完全不知道......请帮忙。提前致谢

回答by marc_s

You need something like this:

你需要这样的东西:

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

With this approach, you should be able to read all the data you need properly.

使用这种方法,您应该能够正确读取所需的所有数据。

回答by AnthonyLambert

The XML tags are case dependent so contact != Contact.

XML 标记取决于大小写,因此请联系!= 联系。

Change this for a start.

改变这个开始。

回答by Bonomi

The issue is that SelectNodes method takes a XPath expression that is case sensitive.

问题在于 SelectNodes 方法采用区分大小写的 XPath 表达式。

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

            Console.WriteLine($"Contact: {xmldoc.DocumentElement.SelectNodes("Contact").Count}"); // return 2
            Console.WriteLine($"/Contact: {xmldoc.DocumentElement.SelectNodes("/Contact").Count}"); // return 0, and it is the expected!
            Console.WriteLine($"//Contact: {xmldoc.DocumentElement.SelectNodes("//Contact").Count}"); // return 2

            foreach (XmlNode firstName in xmldoc.DocumentElement.SelectNodes("//Profiles/Personal/FirstName"))
            {
                Console.WriteLine($"firstName {firstName.InnerText}");
            }

In the code above you can see 2 first names, "My First Name" and "Person". I just change the first char to upper case "contact" -> "Contact".

在上面的代码中,您可以看到 2 个名字,“My First Name”和“Person”。我只是将第一个字符更改为大写“联系人”->“联系人”。