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"
注意到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 表达式中的单引号。