我有以下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"
答案 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模式删除所选索引节点的实现。
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表达式中的单引号。