2014-08-25 2 views
1

среды: VS 2010, .NET 3.5Получение Неверное значение Разбор XML в C#

Я работаю над проектом, который извлекает данные из веб-службы 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', он вернет первый элемент имени, который он находит в документе. Я не могу найти пример того, как сделать это правильно прямо сейчас, иначе я бы опубликовал ответ. – Phaeze

+0

Что касается dataSourceObjectId, мое подозрение в том, что '.' вызывает это поведение, возможно, попробуйте' InnerXml' вместо 'InnerText' – Phaeze

ответ

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! Это работает отлично! – DellChristy

Смежные вопросы