我有以下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 的列表框中。
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()