我有以下XML。
<Programme>
<Intakes>
<One>
<Information />
</One>
<Two>
<Information />
</Two>
</Intakes>
</Programme>
列出框中的通缉结果信息:
One
Two
基本上我希望填充一个列表框,其中包含每个摄入量的选项(一,二等)。
没有多次出现。
所以我没有个别摄入子节点?
当前代码:
XPathNavigator nav;
XPathDocument docNav;
XPathNodeIterator NodeIter;
string strExpression;
docNav = new XPathDocument(docPath);
nav = docNav.CreateNavigator();
strExpression = "//Intakes/node()";
NodeIter = nav.Select(strExpression);
while (NodeIter.MoveNext())
{
lstIntakes.Items.Add(NodeIter.Current.Value);
}
但是,这只会在列表框中添加一个项目,其中包含节点内的所有xml。
答案 0 :(得分:4)
XPath是XML文档的查询语言,因此无法改变文档的结构。
XSLT是将XML文档转换为另一个的合适工具。这个问题的XSLT解决方案是:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/*"><xsl:apply-templates/></xsl:template>
<xsl:template match="One/node()|Two/node()"/>
</xsl:stylesheet>
在提供的XML文档上应用此转换时:
<Programme>
<Intakes>
<One>
<Information />
</One>
<Two>
<Information />
</Two>
</Intakes>
</Programme>
产生了想要的正确结果:
<Intakes>
<One/>
<Two/>
</Intakes>
更新:OP彻底改变了问题 - 现在想要的结果是:
One
Two
单个XPath 1.0表达式仍然无法提供(并且当您使用C#时,您可能无法访问XPath 2.0实现)。
您首先要选择Intakes
的所有子元素:
/*/Intakes/*
然后你必须遍历返回的节点集,并为其中包含的每个元素评估这个XPath表达式:
name()