1

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

4

1 回答 1

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()
于 2012-06-22T12:55:10.387 回答