Получение неверного значения парсинга XML в C #

1

Окружающая среда: VS 2010,.NET 3.5

Я работаю над проектом, который извлекает данные из веб-службы RESTful. Почти все это работает правильно, за исключением одного раздела, где он получает неправильные значения.

Здесь образец 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);
        }
      }
    }
  }
}

Я ожидаю получить значение "DP6.DOa6" из dataSourceObjectId, но он возвращает только "DP6". И я ожидаю получить значение "Город" от имени, но он возвращает "Запрос 1". Когда я тестирую XPath с вышеуказанным XML по адресу http://www.xpathtester.com/xpath, я получаю правильные значения, но он не работает в моем коде.

Есть предположения?

  • 0
    Проблема с вашим запросом имени состоит в том, что объект XmlNode также сохраняет внешний xml, поэтому, когда вы говорите //name он вернет первый элемент имени, найденный в документе. Я не могу найти пример того, как сделать это правильно прямо сейчас, иначе я бы опубликовал ответ.
  • 0
    Что касается dataSourceObjectId, я подозреваю, что . вызывает такое поведение, возможно, попробуйте InnerXml вместо InnerText
Теги:
xml-parsing

1 ответ

0
Лучший ответ

Проблема с вашим запросом имени заключается в том, что объект XmlNode сохраняет внешний xml, поэтому, когда вы укажете //name он вернет первый элемент имени, который он находит в документе.

Правильный синтаксис xpath будет name (без косой черты).

Что касается dataSourceObjectId мое подозрение в том, что . вызывает такое поведение, возможно, попробуйте 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);
    }
  }
  • 0
    Спасибо Phaeze! Это работает отлично!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню