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
C# XmlDocument SelectNodes is not working
提问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”。我只是将第一个字符更改为大写“联系人”->“联系人”。

