C# XPath-返回子节点,但不返回子节点
我有以下XMLC# XPath-返回子节点,但不返回子节点,c#,xslt,xpath,C#,Xslt,Xpath,我有以下XML <Programme> <Intakes> <One> <Information /> </One> <Two> <Information /> </Two> </Intakes> </Programme> 基本上,我希望填充一个列表
<Programme>
<Intakes>
<One>
<Information />
</One>
<Two>
<Information />
</Two>
</Intakes>
</Programme>
基本上,我希望填充一个列表框,其中包含每个入口(一个、两个等)的选项
没有多次发生
所以我不获取单个入口子节点
当前代码:
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>
这仍然不能由单个XPath 1.0表达式提供(由于您使用的是C#,所以可能无法访问XPath 2.0实现)
您必须首先选择摄入量的所有子元素
:
<Programme>
<Intakes>
<One>
<Information />
</One>
<Two>
<Information />
</Two>
</Intakes>
</Programme>
<Intakes>
<One/>
<Two/>
</Intakes>
/*/Intakes/*
然后必须遍历返回的节点集,并对其中包含的每个元素计算此XPath表达式:
name()
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>
这仍然不能由单个XPath 1.0表达式提供(由于您使用的是C#,所以可能无法访问XPath 2.0实现)
您必须首先选择摄入量的所有子元素
:
<Programme>
<Intakes>
<One>
<Information />
</One>
<Two>
<Information />
</Two>
</Intakes>
</Programme>
<Intakes>
<One/>
<Two/>
</Intakes>
/*/Intakes/*
然后必须遍历返回的节点集,并对其中包含的每个元素计算此XPath表达式:
name()
不太清楚的是,是否有多个
入口
节点,并且要将它们组合在一起?或者您想消除信息
节点是的,请澄清。并更新预期结果。谢谢请解释你为什么要这么做。XPath用于选择节点集。例如,当您选择//Intakes/*
时,您将返回
和
节点以进行进一步处理。你可以忽略更多的孩子。如果您想删除更多的子项并将其持久化到一个文件中,那么您就超出了纯XPath的能力。是的,您想使用为选择而设计的工具(XPath)并进行转换,这更像是XSLT(或者LINQ到XML)的领域。正如@MarkThomas所说,一旦您选择了Intakes
,您就必须选择它的整个子节点。不太清楚的是,您是否有多个Intakes
节点,并且希望将它们组合起来?或者您想消除信息
节点是的,请澄清。并更新预期结果。谢谢请解释你为什么要这么做。XPath用于选择节点集。例如,当您选择//Intakes/*
时,您将返回
和
节点以进行进一步处理。你可以忽略更多的孩子。如果您想删除更多的子项并将其持久化到一个文件中,那么您就超出了纯XPath的能力。是的,您想使用为选择而设计的工具(XPath)并进行转换,这更像是XSLT(或者LINQ到XML)的领域。正如@MarkThomas所说,一旦你选择了摄入量
,你就必然选择了它的全部孩子。在你回答Dimitre时澄清了我的问题,这本书写得很匆忙,我现在意识到它给了我完全错误的印象wanted@Mike:没问题--我已经更新了答案--这说明了如何解决问题吗?在你回答Dimitre时澄清了我的问题,这本书写得很匆忙,我现在意识到它给了我完全错误的印象wanted@Mike:没问题--我已经更新了答案--这说明了如何解决问题吗?