Xpath 错误具有无效令牌

本文关键字:无效 令牌 错误 Xpath | 更新日期: 2023-09-27 18:33:10

我有以下 C# 代码:

var selectNode = xmlDoc.SelectSingleNode("//CodeType[@name='" + codetype + 
    "']/Section[@title='" + section + "']/Code[@code='" + code + "' and 
    @description='" + codedesc + "']") as XmlElement;

当我运行我的代码时,它会引发错误,说"上面的语句有一个无效的令牌"

这些是上述语句的值。

codeType=cbc
section="Mental"
codedesc="Injection, enzyme (eg, collagenase), palmar fascial cord (ie, 
    Dupuytren's contracture"

Xpath 错误具有无效令牌

注意到codedesc中的撇号 ( ' ) ?

你需要以某种方式逃避它。XPath 解释器将其视为字符串分隔符,不知道如何处理它之后的其他撇号。

一种方法是将字符串括在双引号而不是撇号中。

因此,您的代码可以变为:

var selectNode = xmlDoc.SelectSingleNode(
    "//CodeType[@name='" + codetype + "']" +
    "/Section[@title='" + section + "']" +
    "/Code[@code='"" + code + "' and @description='" + codedesc + "'"]") 
    as XmlElement;

(注意,在第四行,撇号(')变成了双引号('"))

虽然此方法适用于您提供的数据,但您仍然不是 100% 安全的:其他记录本身可能包含双引号。如果发生这种情况,我们也需要考虑一些事情来应对这种情况。

如果 xml 架构中有任何特殊字符,则可以根据索引获取选定的节点。因此,这里查看下面的实现,用于从xml模式中删除选定的索引节点。

XML 选择单节点删除操作

var schemaDocument = new XmlDocument();

        schemaDocument.LoadXml(codesXML);
        var xmlNameSpaceManager = new XmlNamespaceManager(schemaDocument.NameTable);
        if (schemaDocument.DocumentElement != null)
            xmlNameSpaceManager.AddNamespace("x", schemaDocument.DocumentElement.NamespaceURI);
        var codesNode = schemaDocument.SelectSingleNode(@"/x:integration-engine-codes/x:code-categories/x:code-category/x:codes", xmlNameSpaceManager);
        var codeNode = codesNode.ChildNodes.Item(Convert.ToInt32(index) - 1);
        if (codeNode == null || codeNode.ParentNode == null)
        {
            throw new Exception("Invalid node found");
        }
        codesNode.RemoveChild(codeNode);
        return schemaDocument.OuterXml;

复制单引号,使其显示为"Dupuytren's 挛缩症"

这样,您就可以转义 xpath 表达式中的单引号。