【发布时间】:2014-10-19 03:37:31
【问题描述】:
环境: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);
}
}
}
}
}
我希望从 dataSourceObjectId 中获得“DP6.DOa6”的值,但它只返回“DP6”。我希望从名称中获得“City”的值,但它返回“Query 1”。当我在http://www.xpathtester.com/xpath 使用上述 XML 测试 XPath 时,我得到了正确的值,但它在我的代码中不起作用。
有什么想法吗?
【问题讨论】:
-
您的名称查询的问题是 XmlNode 对象也保留了外部 xml,因此当您说
//name时,它将返回它在文档中找到的第一个名称元素。我现在找不到如何正确执行此操作的示例,否则我会发布答案。 -
至于 dataSourceObjectId 我怀疑是
.导致了这种行为,也许尝试InnerXml而不是InnerText
标签: c# xml-parsing