如何在具有命名空间前缀的 TXMLDocument 上使用 XPath?

2023-12-09

我有一个从第三方 Web 服务器收到的 XML 数据包:

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:xsd="http://www.w3.org/2001/XMLSchema"
  xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <SomeResponse xmlns="http://someurl">
      <SomeResult>
        .....
      </SomeResult>
    </SomeResponse>
  </soap:Body>
</soap:Envelope>

为了具有跨平台能力,此 XML 被加载到 Delphi 的IXMLDocument:

XmlDoc.LoadFromXML(XmlString);

I'm 使用解决方案使用 XPath 查找 XML 节点。该解决方案在其他情况下也有效,但是当 XML 文档包含命名空间前缀时,它就会失败。

我正在尝试访问路径:

/soap:Envelope/soap:Body/SomeResponse/SomeResult

从链接的答案:

function selectNode(xnRoot: IXmlNode; const nodePath: WideString): IXmlNode;
var
  intfSelect : IDomNodeSelect;
  dnResult : IDomNode;
  intfDocAccess : IXmlDocumentAccess;
  doc: TXmlDocument;
begin
  Result := nil;
  if not Assigned(xnRoot) or not Supports(xnRoot.DOMNode, IDomNodeSelect, intfSelect) then
    Exit;
  dnResult := intfSelect.selectNode(nodePath);
  if Assigned(dnResult) then
  begin
    if Supports(xnRoot.OwnerDocument, IXmlDocumentAccess, intfDocAccess) then
      doc := intfDocAccess.DocumentObject
    else
      doc := nil;
    Result := TXmlNode.Create(dnResult, nil, doc);
  end;
end;

它失败于dnResult := intfSelect.selectNode(nodePath); with EOleException: Reference to undeclared namespace prefix: 'soap'

当节点名称具有名称空间前缀时,如何使其工作?


不要尝试在 XPath 查询中包含名称空间。 如果您想要的只是 SomeResult 节点的文本,那么您可以使用 '//SomeResult' 作为查询。由于某种原因,默认 xml 实现 (msxml) 在默认命名空间上出现问题xmlns="http://someurl" on the SomeResponse父节点。但是,使用 OmniXML 作为 DOMVendor(= 跨平台且从 XE7 起有效 - 感谢 @gabr),这是有效的:

program Project3;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  Xml.XmlIntf,
  Xml.XMLDoc,
  Xml.XMLDom,
  Xml.omnixmldom,
  System.SysUtils;

const
 xml = '<?xml version="1.0" encoding="utf-8"?>'+#13#10+
        '<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"'+#13#10+
        'xmlns:xsd="http://www.w3.org/2001/XMLSchema"'+#13#10+
        'xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">'+#13#10+
        ' <soap:Body>'+#13#10+
        '  <SomeResponse xmlns="http://tempuri.org">'+#13#10+
        '   <SomeResult>1</SomeResult>'+#13#10+
        '  </SomeResponse>'+#13#10+
        ' </soap:Body>'+#13#10+
        '</soap:Envelope>';

function selectNode(xnRoot: IXmlNode; const nodePath: WideString): IXmlNode;
var
  intfSelect : IDomNodeSelect;
  dnResult : IDomNode;
  intfDocAccess : IXmlDocumentAccess;
  doc: TXmlDocument;
begin
  Result := nil;
  if not Assigned(xnRoot) or not Supports(xnRoot.DOMNode, IDomNodeSelect, intfSelect) then
    Exit;
  dnResult := intfSelect.selectNode(nodePath);
  if Assigned(dnResult) then
  begin
    if Supports(xnRoot.OwnerDocument, IXmlDocumentAccess, intfDocAccess) then
      doc := intfDocAccess.DocumentObject
    else
      doc := nil;
    Result := TXmlNode.Create(dnResult, nil, doc);
  end;
end;

function XPathQuery(Doc : IXMLDocument; Query : String) : String;

var
 Node : IXMLNode;

begin
 Result := '';
 Node := SelectNode(Doc.DocumentElement, Query);
 if Assigned(Node) then
  Result := Node.Text
end;

var
 Doc : IXMLDocument;

begin
 DefaultDOMVendor := sOmniXmlVendor;
 Doc := TXMLDocument.Create(nil);
 try
  Doc.LoadFromXML(Xml);
  Writeln(Doc.XML.Text);
  Writeln(XPathQuery(Doc, '//SomeResult'));
 except
  on E: Exception do
   Writeln(E.ClassName, ': ', E.Message);
 end;
 Doc := nil;
 Readln;
end.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在具有命名空间前缀的 TXMLDocument 上使用 XPath? 的相关文章

  • 针对 Soap Web 服务测试应用程序的建议

    我正在寻找一些测试 SOAP Web 服务的建议 我希望能够从 WSDL 创建请求 查看这些请求并检查响应 我还希望它能够与 WS 兼容的服务一起使用 例如使用 WCF wsHttpBinding 时 有什么建议么 我使用 SoapUI h
  • 如何在C#中从XML读取键值

    我有下面的 xml 格式文件 名为 ResourceData xml
  • 使用“save”方法更改 ado 对象的 xml 导出字段的精度

    我正在开发一个 VB6 应用程序 该应用程序使用 ADODB Recordset 对象通过 save 方法将数据转储到 xml 文件 如下所示 adoRecordset Save strDst adPersistXML 其中 strDst
  • SharePoint SoapServerException 调用 GetListItems Web 服务

    我的代码中有以下语句 System Xml XmlNode items lstWebs GetListItems Tasks string Empty listQuery listViewFields string Empty listQu
  • XML 解析:格式良好的检查:未声明的实体

    我正在使用 SSMS 2008 但收到以下错误 你知道这意味着什么吗 Msg 9448 Level 16 State 1 Line 4 XML parsing line 1 character 89 well formed check un
  • 使用非 ASCII(自然语言)XML 标签是否合适?

    使用以非 ASCII 自然语言编写的 XML 标签 元素名称 是否合适 XML 规范允许这样做 请参阅Names http www w3 org TR 2006 REC xml11 20060816 NT Name and 例外情况 htt
  • 不使用 local-name() 或 name() 函数的 XPath

    我必须解析oprResult code使用 XPath 从下面的 XML 中获取 XPath 表达式 local name oprResult code 正在按预期工作 但是 我无法使用name or local name功能为 在我的解析
  • 如何锁定/密码保护 XML 文件?

    我在 XML 文件中读取和写入数据 我不希望其他人阅读该文件 所以我想为我的文件创建密码或锁定文件 我怎样才能做到这一点 如果不使用加密软件 则无法使用密码保护 XML 文件 XML 文件只是文本 但像 PGP 谷歌搜索 这样的程序应该可以
  • 如何调试仅在应用程序关闭时发生的崩溃? (德尔福)

    因此 经过最近的一些更改 我们发现我们最古老的应用程序之一有时会在关闭时崩溃 这会以 运行时错误 216 消息的形式或来自 Windows 错误报告的消息的形式表明应用程序已停止工作 该应用程序已经发出OutputDebugString 每
  • 如何检查注册表项是否存在

    我不知道我的错误在哪里 它总是跳到else分支 但是密钥存在 我检查了几次 var reg TRegistry begin with TRegistry Create do try RootKey HKEY CURRENT USER Ope
  • 最好的 php DOM 2 数组函数是什么?

    我想解析xml文件 到目前为止 我发现最好的方法是使用 DOMDocument 类 示例 xml 字符串
  • 在Excel VBA中将图像(jpg)转换为base64?

    我需要在 Excel 中转换图像 或通过VBA 转为base64 最后我将进行XML输出 我怎样才能做到这一点 我需要引用 DOM 吗 我一直在读书这个问题 https stackoverflow com questions 169907
  • 从流中过滤/删除无效的 xml 字符

    首先 我无法更改 xml 的输出 它是由第三方生成的 他们在 xml 中插入无效字符 我得到了 xml 字节流表示形式的 InputStream 除了将流消耗到字符串中并对其进行处理之外 是否有一种更干净的方法来过滤掉有问题的字符 我找到了
  • XML 渲染错误 Android 预览 N

    更新后我已将 android SDK 更新为 android Preview N 但收到此 xml 渲染错误 单击详细信息后 它显示以下堆栈跟踪如何避免这种情况 org jetbrains android uipreview Renderi
  • 为什么 JDOM 的 getChild() 方法返回 null?

    我正在做一个关于 html 文档操作的项目 我想要现有 html 文档中的正文内容将其修改为新的 html 现在我正在使用 JDOM 我想在我的编码中使用 body 元素 为此 我在编码中使用了 getChild body 但它向我的程序返
  • Delphi 将面板流传输至文件

    今天我有一个关于将表单的一部分流式传输到文件的问题 在此示例中 我使用 Tmemo 而不是文件来查看流 这是我的表格 表单右上角的面板有一些控件 如标签 编辑等 使用 保存面板 按钮将面板保存在 TStream 上 这里是代码 proced
  • 如何在 C# 中使用 XmlDsigC14NTransform 类

    我正在尝试使用规范化 xml 节点System Security Cryptography Xml XMLDsigC14nTransformC net Framework 2 0 的类 该实例需要三种不同的输入类型 NodeList Str
  • CDATA 真的有必要吗?

    我经常使用内联 Javascript 通常是在我制作的 WordPress 主题中 我没有听说过将内联 Javascript 包装在 直到几个月前 几年来我一直在以相当的能力水平做这些事情 我用谷歌搜索了一下 听说人们使用它是因为他们的 J
  • (Kiss)XML xpath 和默认命名空间

    我正在开发一个 iPhone 项目 需要解析一些 xml xml 可能包含也可能不包含默认名称空间 我需要知道如何解析 xml 以防它使用默认命名空间 由于我需要读取和写入 xml 因此我倾向于使用 KissXML 但我愿意接受建议 这是我
  • 任意通用列表的通配符

    我有一个类 MyClass 它不是通用的 包含任意 TList 并对其执行某些操作 我希望用通用 TList 替换 TList 但 MyClass 必须保持非通用 由于 Delphi 是不变的 这样的事情是行不通的 list1 TList

随机推荐

  • 开玩笑: toBeInstanceOf(Object) 失败

    只是检查我们是否正在导出对象失败 如下所示 import as Foo from foo describe Foo gt test should export an object gt expect Foo toBeInstanceOf O
  • 基于字符向量重新排序数据框

    我认为这应该非常简单 但我找不到办法做到这一点 我想根据一个因素重新排序数据框 到目前为止我能找到的所有答案都提供了逻辑排序 但这是任意的 并且是数字和字母的混合 也许这是一个问题 因为它是factor not a vector 但向量的答
  • 在Python中获取音频输入设备列表

    如何使用 Python 以这种格式获取 Linux 中的音频输入设备列表hw 0 1 我已经使用 pyaudio 尝试了以下操作 def getaudiodevices p pyaudio PyAudio print p get defau
  • 如何构建netty-transport-native-epoll-4.0.32.Final-linux-x86_64.jar?

    我在 netty 中使用本机 epoll 传输 并且能够从存储库下载 netty transport native epoll 4 0 32 jar 不过我还需要 netty transport native epoll 4 0 32 Fi
  • Xamarin 跨平台证书固定

    我正在使用 Xamarin 设计一个应用程序 我想通过使用证书固定来提高我们的安全性 但我找不到办法做到这一点 我可以使用 android 的本机方法来做到这一点 但我想知道是否有跨平台的解决方案 甚至是 Windows Phone 的解决
  • 在 Web 应用程序中创建和下载巨大 ZIP(来自多个 BLOB)的最佳实践

    我需要从我的 Web 应用程序执行大量文件下载 显然 这将是一个长期运行的操作 它将被用于每年一次 每个客户 所以时间不是问题 除非超时 但我可以通过创建某种形式的 keepalive 心跳来处理 我知道如何创建一个隐藏的iframe并与它
  • 以编程方式将应用程序添加到 Windows 防火墙

    我有一个通过 ClickOnce 安装和更新的应用程序 该应用程序通过 FTP 下载文件 因此需要添加为 Windows 防火墙的例外 由于 ClickOnce 的工作方式 EXE 的路径会随着每次更新而变化 因此异常也需要更改 对防火墙进
  • bash-求行中数字的平均值

    我正在尝试逐行读取文件并找到每行中数字的平均值 我收到错误 expr non numeric argument 我已将问题范围缩小到 sum expr sum i 但我不确定为什么代码不起作用 while read a rows do fo
  • 如何安排 C# Windows 服务每天运行一个方法? [复制]

    这个问题在这里已经有答案了 可能的重复 如何安排 C Windows 服务每天执行任务 我正在创建一个 C Windows 服务 但我没有找到让计时器每天在 App Config 文件中指定的特定时间触发方法的最佳方法 例如 每天早上 6
  • 运行libsandbox

    我目前正在开发一个在线 C C 汇编编译器 我偶然发现了一个名为 libsandbox 的好软件 这使我能够运行在线编写的代码 对其进行编译并拦截系统调用 如果有 首先 我对 Linux 环境还是个新手 我已经下载了 tar gz 解压它
  • Facebook Login Graph API 返回错误的个人资料图片 URL

    我通过调用使用 Facebook 图形 API它返回我期望的 json 响应 像这样的东西 id 1234567890987654321 email xxxxxx u0040example com name xxxx xxxx first
  • C# 无符号字节加密到 Java 有符号字节解密

    我有一个 C 加密应用程序我的部分文件 因为它们是大文件 使用 RijndaelManaged 因此 我将文件转换为字节数组并仅加密其中的一部分 然后我想使用Java解密该文件 所以我必须解密仅文件的一部分 指那些字节 在 C 中加密 问题
  • Google QUERY 公式包含下拉列表中的“全部”

    我有 3 个单独的下拉菜单来在我的 Google 表格中生成以下 QUERY 函数 QUERY HISOP Training A2 D select A B C D where A contains M5 and C contains M6
  • 将字符串变量传递给 MySQL,作为元组失败

    使用新购买的 RaspberryPi 我对 Python MySQL 非常陌生 所以请原谅我发布的天真问题 我已经看过很多关于此问题的问答 但我似乎无法理解 为什么 这会失败 我收到错误 必须是字符串或只读缓冲区 而不是元组 如果我用 TY
  • 批处理命令删除文件夹中除一个文件之外的所有内容(子文件夹和文件)

    首先 过去已经回答过类似的问题 但不完全是我的问题 在其他一些解决方案中 建议隐藏文件夹 文件和更改属性 但我不希望这样做 除非没有更简单的方法可用 另外 我已经尝试了这里建议的解决方案 以及其他几个 MS DOS命令删除除一个之外的所有文
  • 使用 TEXT_DETECTION 来自 Cloud Vision API 的结果区域设置

    我在用着npm node cloud vision api API 正确检测文档的语言 但结果字符以与区域设置不对应的西方字符子集返回 我假设它们应该以 UTF 8 字符返回 但所有区域设置特定字符都映射到基本西方字符子集 例如 Warto
  • 如何查看 HttpWebRequest 类发送的原始 HTTP 请求?

    我知道你们都会回答 使用像 Fiddler 这样的调试代理服务器 但事情没那么简单 这是我的情况 我有一些代码在服务器上运行 位于 ASP NET 页面代码隐藏 aspx cs 中 它 除其他外 建立了到another服务器 抓取一些东西
  • 创建注册表项时出现 UnauthorizedAccessException

    我正在研究如何添加shortcut在我的应用程序的 Windows 上下文菜单中 我碰到this文章 我尝试了一下 这是它用来在注册表中创建密钥的代码 private void btnAddMenu Click object sender
  • Git - 将存储库与签出分支同步的最简单方法

    我的工作流程基本上是 在我的台式电脑上创建一个存储库 对其进行一些工作并提交更改 克隆到我的笔记本电脑上 致力于此 提交更改 现在我想将更改与我的桌面同步 试git push desktop local my repo会失败 因为maste
  • 如何在具有命名空间前缀的 TXMLDocument 上使用 XPath?

    我有一个从第三方 Web 服务器收到的 XML 数据包