Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.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# 获取具有特定id值的元素的XPath字符串_C#_Xml_Xpath - Fatal编程技术网

C# 获取具有特定id值的元素的XPath字符串

C# 获取具有特定id值的元素的XPath字符串,c#,xml,xpath,C#,Xml,Xpath,我试图创建一个XPath查询/字符串,从XML文档中获取特定元素。我试图获取id=38的元素,但由于某些原因,我的代码总是不返回任何内容 如果您查看我的代码和XML文件的组织,您能告诉我需要什么XPath来获取id为38的元素吗? 我的代码是: XmlDocument xdoc = new XmlDocument(); xdoc.Load(getProductURL()); XmlNode node = xdoc.DocumentElement.SelectSingleNode("id('38'

我试图创建一个XPath查询/字符串,从XML文档中获取特定元素。我试图获取id=38的元素,但由于某些原因,我的代码总是不返回任何内容

如果您查看我的代码和XML文件的组织,您能告诉我需要什么XPath来获取id为38的元素吗?

我的代码是:

XmlDocument xdoc = new XmlDocument();
xdoc.Load(getProductURL());
XmlNode node = xdoc.DocumentElement.SelectSingleNode("id('38')");

// node always is null for some reason?
xml的组织方式如下所示:

<courseg>
    <group isempty="False" isbranch="true" id="1" name="abc">
        <group isempty="False" isbranch="true" id="38" name="def"></group>
    </group>
</courseg>

您需要的XPath是

//*[@id='38']
以下是XDocument的示例:

        XDocument xdoc = XDocument.Parse(@"
<courseg>
    <group isempty=""False"" isbranch=""true"" id=""1"" name=""abc"">
        <group isempty=""False"" isbranch=""true"" id=""38"" name=""def""></group>
    </group>
</courseg>");
        XElement node = xdoc.Root.XPathSelectElement("//*[@id='38']");
        Console.WriteLine(node);
XDocument xdoc=XDocument.Parse(@)
");
XElement节点=xdoc.Root.XPathSelectElement(“/*[@id='38']”);
控制台写入线(节点);
使用此XPath查询:

//*[@id = 38]
它选择具有
id
属性等于
38
的每个节点。如果您必须更加具体,即选择
id
属性等于
38
group
,请使用以下选项:

//group[@id = 38]
当你提到

xdoc.DocumentElement.SelectSingleNode("id('38')"
您要求xmldocument在根节点内搜索名为“id”的子节点。但理想情况下,“id”是一个属性,而不是xmlnode

因此,您必须使用
//group[@id='38']
获取所有名为'group'且属性'id'值为38的子节点。函数id('P38')将选择id值为P38的元素。但这不仅仅意味着“一个名为'id'的属性”。这意味着DTD或模式中声明为ID类型的属性。您没有显示DTD或模式,我怀疑您没有。如果您这样做了,并且它将id属性声明为id类型,那么您的文档将无效,因为id值不能都是数字(出于传统SGML的原因,它必须采用名称的形式)

实际上,除非有严格的性能要求,否则最好避免使用id()函数。它太脆弱了——只有在您根据模式或DTD验证源文档时,它才起作用。在XSLT中,改为使用key()。或者,许多处理器现在将属性名xml:id识别为一个“自声明”的id值,而不参考模式或DTD:如果处理器支持,则使用它。

错误。id()函数不是这样做的。