C# 在C中解析XML时获取错误的值

C# 在C中解析XML时获取错误的值,c#,xml-parsing,C#,Xml Parsing,环境:VS 2010,.NET 3.5 我正在从事一个从RESTful web服务中提取数据的项目。除了一个部分的值不正确外,几乎所有部分都正常工作 下面是这部分代码中使用的XML示例: <?xml version="1.0" encoding="utf-8" standalone="yes"?> <dataprovider> <id>DP6</id> <name>Query 1</name> <dataS

环境:VS 2010,.NET 3.5

我正在从事一个从RESTful web服务中提取数据的项目。除了一个部分的值不正确外,几乎所有部分都正常工作

下面是这部分代码中使用的XML示例:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<dataprovider>
  <id>DP6</id>
  <name>Query 1</name>
  <dataSourceId>96390</dataSourceId>
  <dataSourcePrefix>DS6</dataSourcePrefix>
  <updated>2014-08-25T16:51:38.000-04:00</updated>
  <duration>1</duration>
  <isPartial>false</isPartial>
  <rowCount>13</rowCount>
  <flowCount>1</flowCount>
  <dictionary>
    <expression qualification="Dimension" dataType="String">
      <id>DP6.DOa6</id>
      <name>City</name>
      <description>City located.</description>
      <dataSourceObjectId>DS6.DOa6</dataSourceObjectId>
      <formulaLanguageId>[City]</formulaLanguageId>
    </expression>
  </dictionary>
</dataprovider>
private void loadElements(List<string> dps, int rptId)
{
  string name = string.Empty;
  string id = string.Empty;
  string elementUrl = baseUrl + string.Format(C_WEBI_URL, rptId) + C_DP_URL;
  foreach (string dpId in dps)
  {
    XmlDocument dpXml = getResponse(elementUrl + "/" + dpId);
    //get the Expression nodes that define the objects on the report
    XmlNodeList elementNodes = dpXml.SelectNodes("//expression");
    if (elementNodes != null)
    {
      foreach (XmlNode node in elementNodes)
      {
        id = node.SelectSingleNode("//dataSourceObjectId").InnerText;
        if (!elements.ContainsKey(id))
        {
          name = node.SelectSingleNode("//name").InnerText;
          elements.Add(id, name);
        }
      }
    }
  }
}
代码如下:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<dataprovider>
  <id>DP6</id>
  <name>Query 1</name>
  <dataSourceId>96390</dataSourceId>
  <dataSourcePrefix>DS6</dataSourcePrefix>
  <updated>2014-08-25T16:51:38.000-04:00</updated>
  <duration>1</duration>
  <isPartial>false</isPartial>
  <rowCount>13</rowCount>
  <flowCount>1</flowCount>
  <dictionary>
    <expression qualification="Dimension" dataType="String">
      <id>DP6.DOa6</id>
      <name>City</name>
      <description>City located.</description>
      <dataSourceObjectId>DS6.DOa6</dataSourceObjectId>
      <formulaLanguageId>[City]</formulaLanguageId>
    </expression>
  </dictionary>
</dataprovider>
private void loadElements(List<string> dps, int rptId)
{
  string name = string.Empty;
  string id = string.Empty;
  string elementUrl = baseUrl + string.Format(C_WEBI_URL, rptId) + C_DP_URL;
  foreach (string dpId in dps)
  {
    XmlDocument dpXml = getResponse(elementUrl + "/" + dpId);
    //get the Expression nodes that define the objects on the report
    XmlNodeList elementNodes = dpXml.SelectNodes("//expression");
    if (elementNodes != null)
    {
      foreach (XmlNode node in elementNodes)
      {
        id = node.SelectSingleNode("//dataSourceObjectId").InnerText;
        if (!elements.ContainsKey(id))
        {
          name = node.SelectSingleNode("//name").InnerText;
          elements.Add(id, name);
        }
      }
    }
  }
}
我希望从dataSourceObjectId获得一个值DP6.DOa6,但它只返回DP6。我希望从名称中得到City的值,但它返回查询1。在使用上述XML测试XPath时,我得到了正确的值,但在我的代码中它不起作用


有什么想法吗?

名称查询的问题是XmlNode对象也保留了外部xml,因此当您说//name时,它将返回它在文档中找到的第一个name元素

正确的xpath语法将是名称无斜杠


至于数据源目标,我怀疑。导致此行为的原因可能是尝试InnerXml而不是InnerText

完整示例:

foreach (XmlNode node in elementNodes)
  {
    id = node.SelectSingleNode("dataSourceObjectId").InnerXml; //I'm not sure if this will solve the problem.
    if (!elements.ContainsKey(id))
    {
      name = node.SelectSingleNode("name").InnerText;
      elements.Add(id, name);
    }
  }

名称查询的问题是XmlNode对象也保留了外部xml,因此当您说//name时,它将返回它在文档中找到的第一个name元素。我现在找不到一个正确的例子,否则我会发布一个答案。导致此行为的原因可能是尝试InnerXml而不是InnerText