【问题标题】:Using XPath to parse (SOAP-based) XML in JavaScript在 JavaScript 中使用 XPath 解析(基于 SOAP 的)XML
【发布时间】:2013-12-07 23:20:12
【问题描述】:

我通过 AJAX 调用从基于 SOAP 的 Web 服务接收以下 XML。

<s:Envelope
    xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
    <s:Header>
        <ActivityId
            CorrelationId="d2ba6844-ec96-4ddc-a3aa-36c8bdd2daeb"
            xmlns="http://schemas.microsoft.com/2004/09/ServiceModel/Diagnostics">
            8c74da56-65c1-4f50-9dc6-547dc9b208a6
            </ActivityId>
        </s:Header>
    <s:Body>
        <MyResponse
            xmlns="http://foo.example.com/">
            <MyResult
                xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
                <Bar>
                    1ab6cd3a6499
                    </Bar>
                </MyResult>
            </MyResponse>
        </s:Body>
    </s:Envelope>

我想在(基于 JavaScript 的)客户端上使用 XPath 来解析 XML 以找到 Bar 的值。

我可以使用 XPath 在 iOS 上通过 KissXML 解析这个 XML。我首先将名为baz 的命名空间添加到值为"http://foo.example.com/" 的根元素,然后我可以使用"/s:Envelope/s:Body/baz:MyResponse/baz:MyResult/baz:Bar" 之类的XPath 表达式调用nodesForXPath:error:

尽管阅读了 MDN 上的 Introduction to using XPath in JavaScript,但我不知道如何正确调用 evaluate 函数。

如何在 JavaScript 中解析这个 XML?

(我对任何外部库没有任何依赖关系,例如 jQuery,所以我希望我的解决方案不需要我添加任何库。)

【问题讨论】:

  • 添加“baz”命名空间是什么意思?您不必为此创建命名空间声明。
  • 添加baz 命名空间允许我在我的XPath 语句中添加MyResponseMyResultBar 前缀,因为它们都在MyResponse 元素中声明的默认命名空间中。

标签: javascript xml dom xpath xml-parsing


【解决方案1】:

我创建了一个 jsfiddle 来向您展示如何使用 javascript 评估函数来使用 xPath 获取 Bar 元素的值:

http://jsfiddle.net/Fresh/uL7rA/

实现这一点的代码在这里:

var bar = document.evaluate('//MyResponse/MyResult/Bar', document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null );

alert( bar.singleNodeValue.textContent );

【讨论】:

  • 我不想随便抓一个Bar。我想确定我得到的是那个准确的。
  • 我已经修改了答案以获取位于 MyResponse 元素中的 Bar 元素。这现在足够具体了吗?
  • '//MyResponse/MyResult/Bar' 将匹配它找到的第一个这样的序列,它可能不在 SOAP 信封内的 SOAP 主体内;例如如果您在 SOAP 标头中添加了 &lt;MyResponse&gt;&lt;MyResult&gt;&lt;Bar&gt;badvalue&lt;/Bar&gt;&lt;/MyResult&gt;&lt;/MyResponse&gt;。我使用这样的 XPath 的部分原因是为了执行一些基本的数据验证。
【解决方案2】:

如果只有一个&lt;Bar&gt; 元素,使用.querySelector() 可能比使用XPath 更容易,比如

doc.querySelector('Bar')

【讨论】:

  • Bar 可能没有一个。我需要得到的Bar 必须在SOAP 信封内的SOAP 主体内;没有其他 Bar 应该匹配。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-18
  • 2013-11-25
  • 1970-01-01
相关资源
最近更新 更多