SOAPUI中的属性传输。如何使用特定参数传输数据?

时间:2015-10-26 12:53:30

标签: web-services soap automation soapui

我有这样的回应:

<s:Envelope xmlns:s="http://.....">
<s:Body>
  <GetHistoricalMeterReadingsByEanResponse xmlns="....">
     <GetHistoricalMeterReadingsByEanResult xmlns:a="....." xmlns:i="http://....">
        <Header xmlns=".....">
           <HasException>false</HasException>
           <Message/>
        </Header>
        <a:HistoricalReadingSet>
           <a:HistoricalMeterReadingSet>
              <a:EanId>111425200000005564</a:EanId>
              <a:HistoricalReadings>
                 <a:HistoricalMeterReading>
                    <a:ClientReadingDate i:nil="true"/>
                    <a:EanId>111425200000005564</a:EanId>
                    <a:EdsnMeterId>3523525</a:EdsnMeterId>
                    <a:EnergyProductType>ELK</a:EnergyProductType>
                    <a:MeterReadingId>1842643</a:MeterReadingId>
                    <a:Mutation>
                       <a:Consumer i:nil="true"/>
                       <a:DossierId i:nil="true"/>
                       <a:Initiator i:nil="true"/>
                       <a:MarketEvent>Historical</a:MarketEvent>
                       <a:MarketEventDate>2015-01-28T00:00:00</a:MarketEventDate>
                    </a:Mutation>
                    <a:NrOfRegisters>2</a:NrOfRegisters>
                    <a:ProcessId i:nil="true"/>
                    <a:ReadingSource>Customer_TMR</a:ReadingSource>
                    <a:RegisterReadings>
                       <a:RegisterReading>
                          <a:MeasureUnit>KWH</a:MeasureUnit>
                          <a:MeteringDirection>LVR</a:MeteringDirection>
                          <a:NrOfDigits>6</a:NrOfDigits>
                          <a:TariffType>L</a:TariffType>
                          <a:Value>1345</a:Value>
                       </a:RegisterReading>
                       <a:RegisterReading>
                          <a:MeasureUnit>KWH</a:MeasureUnit>
                          <a:MeteringDirection>LVR</a:MeteringDirection>
                          <a:NrOfDigits>6</a:NrOfDigits>
                          <a:TariffType>N</a:TariffType>
                          <a:Value>2345</a:Value>
                       </a:RegisterReading>
                    </a:RegisterReadings>
                    <a:Status>Accepted</a:Status>
                    <a:BudgetCanStartSettlement>false</a:BudgetCanStartSettlement>
                    <a:CanStartDispute>false</a:CanStartDispute>
                    <a:OtherSupplierCanStartSettlement>false</a:OtherSupplierCanStartSettlement>
                 </a:HistoricalMeterReading>
                 <a:HistoricalMeterReading>
                    <a:ClientReadingDate i:nil="true"/>
                    <a:EanId>111425200000005564</a:EanId>
                    <a:EdsnMeterId>3523525</a:EdsnMeterId>
                    <a:EnergyProductType>ELK</a:EnergyProductType>
                    <a:MeterReadingId>1842645</a:MeterReadingId>
                    <a:Mutation>
                       <a:Consumer>8714252018141</a:Consumer>
                       <a:DossierId>23074990</a:DossierId>
                       <a:Initiator>1114252018146</a:Initiator>
                       <a:MarketEvent>Periodic</a:MarketEvent>
                       <a:MarketEventDate>2015-09-14T00:00:00</a:MarketEventDate>
                    </a:Mutation>
                    <a:NrOfRegisters>2</a:NrOfRegisters>
                    <a:ProcessId i:nil="true"/>
                    <a:ReadingSource>Customer_EDSN</a:ReadingSource>
                    <a:RegisterReadings>
                       <a:RegisterReading>
                          <a:MeasureUnit>KWH</a:MeasureUnit>
                          <a:MeteringDirection>LVR</a:MeteringDirection>
                          <a:NrOfDigits>6</a:NrOfDigits>
                          <a:TariffType>L</a:TariffType>
                          <a:Value>3000</a:Value>
                       </a:RegisterReading>
                       <a:RegisterReading>
                          <a:MeasureUnit>KWH</a:MeasureUnit>
                          <a:MeteringDirection>LVR</a:MeteringDirection>
                          <a:NrOfDigits>6</a:NrOfDigits>
                          <a:TariffType>N</a:TariffType>
                          <a:Value>4000</a:Value>
                       </a:RegisterReading>
                    </a:RegisterReadings>
                    <a:Status>Accepted</a:Status>
                    <a:BudgetCanStartSettlement>false</a:BudgetCanStartSettlement>
                    <a:CanStartDispute>true</a:CanStartDispute>
                    <a:OtherSupplierCanStartSettlement>true</a:OtherSupplierCanStartSettlement>
                 </a:HistoricalMeterReading>                    
              </a:HistoricalReadings>
           </a:HistoricalMeterReadingSet>
        </a:HistoricalReadingSet>
     </GetHistoricalMeterReadingsByEanResult>
  </GetHistoricalMeterReadingsByEanResponse>

               

问题是:我在oreder中使用此响应来查找具有3value field = true的项目。我需要这样的项目用于下一个请求方法。

我试过像这样的smth,但它不起作用:

    <a:HistoricalReadingSet//a:HistoricalMeterReadingSet//a:HistoricalReadings//a:HistoricalMeterReading a="http://....">
{
for $x in //a:HistoricalReadingSet//a:HistoricalMeterReadingSet//a:HistoricalReadings//a:HistoricalMeterReading
where $x/a:HistoricalReadingSet//a:HistoricalMeterReadingSet//a:HistoricalReadings//a:HistoricalMeterReading//a:CanStartDispute/text() = 'true'
return $x
}
</a:HistoricalReadingSet//a:HistoricalMeterReadingSet//a:HistoricalReadings//a:HistoricalMeterReading>

有什么问题?你会怎么做?

1 个答案:

答案 0 :(得分:1)

在Xml中,数字不允许作为标记名称的第一个字符,除了你的xml没有很好地形成,因为某些标记没有正确关闭。首先尝试更正你的xml。

<a:SetOfItems>   
<a:Item>
 <a:Id>1</a:Id>
 <a:firstValue>12121212</a:firstValue>                    
 <a:secondValue>sdfhjfsdf</a:secondValue>
 <a:thirdValue>false</a:thirdValue>
</a:Item>

<a:Item>
 <a:Id>2</a:Id>
 <a:firstValue>12121212</a:firstValue>                    
 <a:secondValue>sdfhjfsdf</a:secondValue>
 <a:thirdValue>true</a:thirdValue>
</a:Item>
</a:SetOfItems>    

然后,要将您的XQuery添加为属性转移,仅选择<a:Item>元素,其中<a:thirdValue>具有文本值true,您可以使用以下表达式:

<a:SetOfItems xmlns:a="blabla">  
{
for $x in //*:Item
where $x/*:thirdValue/text() = 'true'
return $x
}
</a:SetOfItems>

请注意使用*通配符来引用任何名称空间。

将此XQuery应用于您的XML,您将获得:

<a:SetOfItems xmlns:a="blabla">
    <a:Item>
        <a:Id>2</a:Id>
        <a:firstValue>12121212</a:firstValue>
        <a:secondValue>sdfhjfsdf</a:secondValue>
        <a:thirdValue>true</a:thirdValue>
    </a:Item>
</a:SetOfItems>

基于问题更新的编辑

我认为您的XQuery中存在各种错误,后续XQuery适用于您的xml:

<a:HistoricalReadingSet xmlns:a="http://a">
{
for $x in //*:HistoricalReadingSet/*:HistoricalMeterReadingSet
where $x/*:HistoricalReadings/*:HistoricalMeterReading/*:CanStartDispute/text() = 'true'
return $x
}
</a:HistoricalReadingSet>

它产生以下结果:

<a:HistoricalReadingSet xmlns:a="http://a">
    <a:HistoricalMeterReadingSet xmlns:a="http://a" xmlns:i="http://i" xmlns="http://b" xmlns:s="http://soap">
        <a:EanId>111425200000005564</a:EanId>
        <a:HistoricalReadings>
            <a:HistoricalMeterReading>
                <a:ClientReadingDate i:nil="true"/>
                <a:EanId>111425200000005564</a:EanId>
                <a:EdsnMeterId>3523525</a:EdsnMeterId>
                <a:EnergyProductType>ELK</a:EnergyProductType>
                <a:MeterReadingId>1842643</a:MeterReadingId>
                <a:Mutation>
                    <a:Consumer i:nil="true"/>
                    <a:DossierId i:nil="true"/>
                    <a:Initiator i:nil="true"/>
                    <a:MarketEvent>Historical</a:MarketEvent>
                    <a:MarketEventDate>2015-01-28T00:00:00</a:MarketEventDate>
                </a:Mutation>
                <a:NrOfRegisters>2</a:NrOfRegisters>
                <a:ProcessId i:nil="true"/>
                <a:ReadingSource>Customer_TMR</a:ReadingSource>
                <a:RegisterReadings>
                    <a:RegisterReading>
                        <a:MeasureUnit>KWH</a:MeasureUnit>
                        <a:MeteringDirection>LVR</a:MeteringDirection>
                        <a:NrOfDigits>6</a:NrOfDigits>
                        <a:TariffType>L</a:TariffType>
                        <a:Value>1345</a:Value>
                    </a:RegisterReading>
                    <a:RegisterReading>
                        <a:MeasureUnit>KWH</a:MeasureUnit>
                        <a:MeteringDirection>LVR</a:MeteringDirection>
                        <a:NrOfDigits>6</a:NrOfDigits>
                        <a:TariffType>N</a:TariffType>
                        <a:Value>2345</a:Value>
                    </a:RegisterReading>
                </a:RegisterReadings>
                <a:Status>Accepted</a:Status>
                <a:BudgetCanStartSettlement>false</a:BudgetCanStartSettlement>
                <a:CanStartDispute>false</a:CanStartDispute>
                <a:OtherSupplierCanStartSettlement>false</a:OtherSupplierCanStartSettlement>
            </a:HistoricalMeterReading>
            <a:HistoricalMeterReading>
                <a:ClientReadingDate i:nil="true"/>
                <a:EanId>111425200000005564</a:EanId>
                <a:EdsnMeterId>3523525</a:EdsnMeterId>
                <a:EnergyProductType>ELK</a:EnergyProductType>
                <a:MeterReadingId>1842645</a:MeterReadingId>
                <a:Mutation>
                    <a:Consumer>8714252018141</a:Consumer>
                    <a:DossierId>23074990</a:DossierId>
                    <a:Initiator>1114252018146</a:Initiator>
                    <a:MarketEvent>Periodic</a:MarketEvent>
                    <a:MarketEventDate>2015-09-14T00:00:00</a:MarketEventDate>
                </a:Mutation>
                <a:NrOfRegisters>2</a:NrOfRegisters>
                <a:ProcessId i:nil="true"/>
                <a:ReadingSource>Customer_EDSN</a:ReadingSource>
                <a:RegisterReadings>
                    <a:RegisterReading>
                        <a:MeasureUnit>KWH</a:MeasureUnit>
                        <a:MeteringDirection>LVR</a:MeteringDirection>
                        <a:NrOfDigits>6</a:NrOfDigits>
                        <a:TariffType>L</a:TariffType>
                        <a:Value>3000</a:Value>
                    </a:RegisterReading>
                    <a:RegisterReading>
                        <a:MeasureUnit>KWH</a:MeasureUnit>
                        <a:MeteringDirection>LVR</a:MeteringDirection>
                        <a:NrOfDigits>6</a:NrOfDigits>
                        <a:TariffType>N</a:TariffType>
                        <a:Value>4000</a:Value>
                    </a:RegisterReading>
                </a:RegisterReadings>
                <a:Status>Accepted</a:Status>
                <a:BudgetCanStartSettlement>false</a:BudgetCanStartSettlement>
                <a:CanStartDispute>true</a:CanStartDispute>
                <a:OtherSupplierCanStartSettlement>true</a:OtherSupplierCanStartSettlement>
            </a:HistoricalMeterReading>
        </a:HistoricalReadings>
    </a:HistoricalMeterReadingSet>
</a:HistoricalReadingSet>

基于评论的编辑

如果您只想取<MeterReadingId> sibling为真的<CanStartDispute>值,您只需使用跟随XPath而不是XQuery:

//*:HistoricalReadingSet/*:HistoricalMeterReadingSet/*:HistoricalReadings/*:HistoricalMeterReading/*:MeterReadingId[../*:CanStartDispute/text() = 'true']

希望它有所帮助,