Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# XPath-返回子节点,但不返回子节点_C#_Xslt_Xpath - Fatal编程技术网

C# XPath-返回子节点,但不返回子节点

C# XPath-返回子节点,但不返回子节点,c#,xslt,xpath,C#,Xslt,Xpath,我有以下XML <Programme> <Intakes> <One> <Information /> </One> <Two> <Information /> </Two> </Intakes> </Programme> 基本上,我希望填充一个列表

我有以下XML

<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:没问题--我已经更新了答案--这说明了如何解决问题吗?