使用XQUERY检索属性值

使用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

是否可以使用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</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)