使用XQUERY检索属性值
是否可以使用XQUERY从以下XML中检索属性使用XQUERY检索属性值,xquery,Xquery,是否可以使用XQUERY从以下XML中检索属性filename?我试图使用/preFileDoc/inpXML/@filename,但它不起作用 <?xml version="1.0"?> <preFileDoc xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/"> <senderId>ABC</senderId> <receiverId>XYZ</rece
filename
?我试图使用/preFileDoc/inpXML/@filename
,但它不起作用
<?xml version="1.0"?>
<preFileDoc xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/">
<senderId>ABC</senderId>
<receiverId>XYZ</receiverId>
<tranxCode>A001</tranxCode>
<inpXML version="1.0" encoding="UTF-8">
<soap-env:Envelope>
<soap-env:Header msgcode="SPPCONVAKT" orig-system="002FTB" refid="65355ff50a172064484bf9da64c1e245" timestamp="2009-02-11 21:00:10.741" filename="SPPCONVAKT20090128001.dat"/>
<soap-env:Body>
text1
text2
</soap-env:Body>
</soap-env:Envelope>
</inpXML>
</preFileDoc>
基础知识
XYZ
A001
文本1
文本2
ps:有时,
文件名
属性在传入的XML中作为文件名
发送。考虑从属性@filename
或@filename
中检索值。。它能在单个XQUERY中实现吗?感谢您的建议…您需要尊重并考虑SOAP XML名称空间
因为我不知道您在使用什么,所以我无法告诉您如何执行此操作-但是有xmlns:soap env=”http://schemas.xmlsoap.org/soap/envelope/“
在根节点上,而您的@filename
属性在
节点上-因此您需要在XQuery中包含XML名称空间
在.NET/C#中,您可以这样做(使用直接支持XPath的“older”XmlDocument
样式):
//定义测试XML
字符串xmlContent=
@"
基础知识
XYZ
A001
文本1
文本2
";
//创建XmlDocument并加载测试数据
XmlDocument doc=新的XmlDocument();
doc.LoadXml(xmlContent);
//定义XML命名空间管理器并向其添加SOAP命名空间
XmlNamespaceManager mgr=新的XmlNamespaceManager(doc.NameTable);
管理器AddNamespace(“soap”http://schemas.xmlsoap.org/soap/envelope/");
//使用XPath和XML名称空间获取节点
//前两个节点和不在任何显式
//XML名称空间
//但是接下来的两个(和)在“soap”XML名称空间中
XmlNode header=doc.SelectSingleNode(“/preFileDoc/inpXML/soap:Envelope/soap:header”,mgr);
//从header节点读取“filename”属性
if(header!=null&&header.Attributes[“filename”]!=null)
{
字符串fileName=header.Attributes[“fileName”].Value;
}
您可以使用多个属性的并集。该属性不太可能使用不同的大小写多次出现,因此应始终返回单个节点:
//soap-env:Header/@filename | //soap-env:Header/@fileName
或者,您可以将其用括号括起来,并在其后面添加[1]
,以始终获取第一个结果
(//soap-env:Header/@filename | //soap-env:Header/@fileName)[1]
如果将union替换为逗号(这将创建序列而不是文档顺序节点集),则也可以在末尾添加默认值。在这里可能不是很有用,但在其他情况下可能会:
(//soap-env:Header/@filename , //soap-env:Header/@fileName, "default.dat")[1]
嗯 我认为您的XPath不完整。
/preFileDoc/inpXML/@filename
中的最后一个子步骤/
仅匹配inpXML
元素的属性,而不匹配其子元素
解决此问题的一种方法是/
-步骤:
/preFileDoc/inpXML//@filename
请注意,这也会在soapenv:Body
中找到名为filename
的所有属性
因此,更可靠的方法是在XQuery中声明soapenv
前缀:
declare namespace soap-env="http://schemas.xmlsoap.org/soap/envelope/";
return /preFileDoc/inpXML//soap-env:Header/@filename
最后,filename
的不同大写形式可以通过指定以下两种方式解决:
declare namespace soap-env="http://schemas.xmlsoap.org/soap/envelope/";
return /preFileDoc/inpXML//soap-env:Header/(@filename | @fileName)
您好marc_s..它是在一些支持xquery查询某些xml节点值的开发平台上..您好marc_s..您太好了,您在.NET/C#中提供了整个解决方案..非常感谢..我通过下面的xquery获得了下面声明中所需的内容:-/preFileDoc/inpXML/soap env:Envelope/soap env:Header/@filename |/preFileDoc/inpXML/soap env:Envelope/soap env:Header/@filename感谢grtjn…是的,绝对是解决联合多属性问题所需要的:)
declare namespace soap-env="http://schemas.xmlsoap.org/soap/envelope/";
return /preFileDoc/inpXML//soap-env:Header/(@filename | @fileName)