XPATHSelectElements返回null(XML文件中没有名称空间)

时间:2014-01-04 21:10:44

标签: c# xml xpath linq-to-xml

string xmlFile = GetCountriesFile();

XDocument xd = XDocument.Load(xmlFile);
XElement city = xd.XPathSelectElement("/WorldCities/City"); 

Console.Clear();
// Print the name of the first city
Console.WriteLine(city.Element("Name").Value);

// Get all the cities in the document
// Works in http://xpath.online-toolz.com/tools/xpath-editor.php
// but returns null in .NET
var cities = xd.XPathSelectElements("/WorldCities/City"); 
// cities is set to nulll

Console.ReadKey();

我使用的XML文件不包含名称空间:

<?xml version="1.0" encoding="utf-8" ?> <!-- XML declaration, there can only be one XML declaration in an XML document -->

<WorldCities> <!-- Root node, there can only be one root node in an XML document -->

  <City> <!-- Parent node -->
    <Name>Vancouver</Name> <!-- Child node -->
    <Country>Canada</Country>         <!-- Sibling node of location -->
    <Continent>North America</Continent> <!-- Sibling node of location -->
  </City>

  <City>
    <Name>Buenos Aires</Name>
    <Country>Argentina</Country>
    <Continent>South America</Continent>
  </City>

  <City>
    <Name>Berlin</Name>
    <Country>Germany</Country>
    <Continent>Europe</Continent>
  </City>

  <City>
    <Name>Nairobi</Name>
    <Country>Kenya</Country>
    <Continent>Africa</Continent>
  </City>

  <City>
    <Name>Tokyo</Name>
    <Country>Japan</Country>
    <Continent>Asia</Continent>
  </City>

  <City>
    <Name>Sydney</Name>
    <Country>Australia</Country>
    <Continent>Australia</Continent>
  </City>


</WorldCities>

当我使用XPATH路径“/ WorldCities / City”对抗相同的XML时,http://xpath.online-toolz.com/tools/xpath-editor.php处的XPATH测试器返回了所有City元素。那么为什么XPATHSelectElements方法返回null? XML文件中没有名称空间会导致问题。

2 个答案:

答案 0 :(得分:0)

您的XPath是正确的,您的代码可以正常使用您提供的xml - 它会返回第一个查询的城市元素和第二个查询的6个城市的集合:

enter image description here

我的第一个想法是你正在加载一些其他文件。但是,因此您的第一个查询返回第一个城市元素,然后您的第二个查询应返回至少一个城市。看起来你没有使用相同的xpath进行第二次查询。确保您的真实代码与您提供的代码完全相同

答案 1 :(得分:0)

该方法永远不会返回null,而是返回一个IEnumerable<XElement>,您必须在代码中使用该{{1}}来访问集合中的元素(如果有任何选定的话)。但是你不会从该方法中获得null。