【问题标题】:Take values from XML document to string array从 XML 文档中获取值到字符串数组
【发布时间】:2011-06-17 19:24:52
【问题描述】:

我正在尝试从 XML 文件中获取值并将它们放入字符串数组中。这是我用来完成此操作的代码:

public static string[] GetStringArray(string path)
{
    var doc = XDocument.Load(path);

    var services = from service in doc.Descendants("Service")
                    select (string)service.Attribute("name");

    return services.ToArray();
}

但每当我使用它时,我都会在这里收到 NullReferenceException:

foreach (string @string in query)
    WeatherServicesCBO.Items.Add(@string);

这个方法:

public void InitializeDropDown(string XmlFile, string xpath)
{

    //string[] services = { "Google Weather", "Yahoo! Weather", "NOAA", "WeatherBug" };
    string[] services = GetStringArray("SupportedWeatherServices.xml");
    IEnumerable<string> query = from service in services
                                orderby service.Substring(0, 1) ascending
                                select service;

    foreach (string @string in query)
        WeatherServicesCBO.Items.Add(@string);
}

编辑这是正在使用的 XML 文件

<?xml version="1.0" encoding="utf-8" ?>
<SupportedServices>
  <Service>
    <name>Google Weather</name>
    <active>Yes</active>
  </Service>
  <Service>
    <name>WeatherBug</name>
    <active>No</active>
  </Service>
  <Service>
    <name>Yahoo Weather</name>
    <active>No</active>
  </Service>
  <Service>
    <name>NOAA</name>
    <active>No</active>
  </Service>
</SupportedServices>

【问题讨论】:

  • 那么,如果每个服务都有名称,您是否查看了 XML?创建 query 时不会显示丢失的内容,但在迭代时不会显示。

标签: c# xml linq xpath


【解决方案1】:

XML 有一个name 元素。您正在尝试读取name 属性。没有,所以你会得到null 回来。进行适当的更改。

var services = from service in doc.Descendants("Service")
                select (string)service.Element("name");

【讨论】:

    【解决方案2】:

    select (string)service.Attribute("name");

    “名称”不是服务的属性。它是一个子元素。

    【讨论】:

      【解决方案3】:

      name 不是Service 的属性,而是一个子元素。您应该将 GetStringArray 查询修改为:

      var services = from service in doc.Descendants("Service")
                     select service.Element("name").Value;
      

      【讨论】:

        【解决方案4】:

        获取Array中的节点列表:

        XmlDocument xDocument;
        xDocument.Load(Path);
        var xArray = xDocument.SelectNodes("SupportedServices/Service/name");
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-10-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-15
          相关资源
          最近更新 更多