从包含CDATA标记的SOAPUI中的XML响应中检索节点值

时间:2014-07-30 13:10:05

标签: xml xpath soapui cdata

我正在尝试使用以下xml SoapUI响应中的Xpath检索原子序号

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
   <soap:Body>
      <GetAtomicNumberResponse xmlns="http://www.webserviceX.NET">
         <GetAtomicNumberResult><![CDATA[<NewDataSet>
  <Table>
    <AtomicNumber>47</AtomicNumber>
    <ElementName>Silver</ElementName>
    <Symbol>Ag</Symbol>
    <AtomicWeight>107.87</AtomicWeight>
    <BoilingPoint>2485</BoilingPoint>
    <IonisationPotential>7.58</IonisationPotential>
    <EletroNegativity>1.42</EletroNegativity>
    <AtomicRadius>1.34</AtomicRadius>
    <MeltingPoint>1235</MeltingPoint>
    <Density>10490</Density>
  </Table>
</NewDataSet>]]></GetAtomicNumberResult>
      </GetAtomicNumberResponse>
   </soap:Body>
</soap:Envelope>

试过以下一个

declare namespace ns2='http://www.webserviceX.NET';
//ns2:GetAtomicNumberResponse[1]/ns2:GetAtomicNumberResult[1]

我从[<NewDataset> .... </NewDataSet>]开始获取所有数据,但我只需要<AtomicNumber>值。

3 个答案:

答案 0 :(得分:3)

这里的问题是CDATA被视为 Xml 中的字符串以及当作为 XPath 工作时;因此,如果您想使用 XPath 访问CDATA内的节点,首先需要创建访问CDATA的路径以及将其内容解析为 Xml的方法

希望 SOAPUI 使用 Saxon Saxon 包含跟随函数saxon:parse,它允许解析从<返回的字符串内容em> XPath 作为 Xml

请注意, Saxon 版本9.3替换saxon:parse-xml的此函数,但是 SOAPUI 无法访问,因为它使用 saxon 版本9.1 0.8。

因此,在您的 Property transfer testStep中,您可以使用以下 XPath

declare namespace ns2='http://www.webserviceX.NET';
(saxon:parse(//ns2:GetAtomicNumberResponse[1]/ns2:GetAtomicNumberResult[1]))//*:AtomicNumber

或者采用较短的 SOAPUI 方式:

(saxon:parse(//*:GetAtomicNumberResponse/*:GetAtomicNumberResult))//*:AtomicNumber

enter image description here

答案 1 :(得分:0)

def respXmlHolder = new XmlHolder(testRunner.testCase.testSteps["GetAtomicNumber"].testRequest.response.getContentAsXml());

respXmlHolder.namespaces["ns"] = "http://www.webserviceX.NET";

def CDATAXml = respXmlHolder.getNodeValue("//ns:GetAtomicNumberResponse/ns:GetAtomicNumberResult");

log.info CDATAXml;

def CDATAXmlHolder = new XmlHolder(CDATAXml);

def atomicNumber=CDATAXmlHolder.getNodeValue("//NewDataSet/Table/AtomicNumber");

com.eviware.soapui.support.UISupport.showInfoMessage("Atomic Number:-"+atomicNumber);

log.info "Atomic Number:-"+atomicNumber

答案 2 :(得分:-3)

C#

XDocument doc = XDocument.Load("XMLFile1.xml");
var result = doc.Descendants(XNamespace.Get("http://www.webserviceX.NET")+"AtomicNumber")
                .First();