我正在尝试创建一个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?
Run Code Online (Sandbox Code Playgroud)
组织xml的方式如下:
<courseg>
<group isempty="False" isbranch="true" id="1" name="abc">
<group isempty="False" isbranch="true" id="38" name="def"></group>
</group>
</courseg>
Run Code Online (Sandbox Code Playgroud)
Pet*_*nov 19
你需要的XPath是
//*[@id='38']
Run Code Online (Sandbox Code Playgroud)
以下是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);
Run Code Online (Sandbox Code Playgroud)
函数id('P38')将选择ID值为P38的元素.但这并不仅仅意味着"名为'id'的属性".它表示在DTD或模式中声明的属性类型为ID.您没有显示DTD或架构,我怀疑您没有.如果你这样做,并且如果它将id属性声明为类型ID,那么你的文档将是无效的,因为ID值不能是全数字的(因为传统的SGML原因,它必须采用名称的形式).
实际上,除非您有严格的性能要求,否则最好避免使用id()函数.它太脆弱了 - 它仅在您根据模式或DTD验证源文档时才有效.在XSLT中,使用key()代替.或者,许多处理器现在将属性名称xml:id识别为"自我声明"ID值,而不引用架构或DTD:如果您的处理器支持它,请使用它.