3

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

3 回答 3

7

注意?中的撇号 ( ')codedesc

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

一种方法是用双引号而不是撇号将字符串括起来。

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

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

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

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

于 2012-05-03T19:36:03.673 回答
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;
于 2019-06-12T10:57:47.667 回答
-3

复制单引号,使其显示为“Dupuytren 的挛缩”

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

于 2014-07-16T21:02:32.477 回答