Xpath错误具有无效令牌

时间:2012-05-03 18:58:11

标签: c# xml xpath

我有以下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"

3 个答案:

答案 0 :(得分:6)

注意'中的撇号(codedesc)?

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

你可以做的一种方法是用双引号括起你的字符串而不是撇号。

您的代码可能因此成为:

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

(请注意,在第四行,撇号(')成为双引号(\"))

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

答案 1 :(得分:1)

如果xml模式中有任何特殊字符,则可以基于index获取选定的节点。因此,这里寻找从xml模式删除所选索引节点的实现。

XML SelectSingleNode删除操作

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;

答案 2 :(得分:-3)

复制单引号,以便它显示" Dupuytren'''

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