2016-01-18 2 views
0

Я очень новичок в SOAPUI, XML &, в котором написаны запросы XPath. У меня есть XML-выход из REST API с использованием интерфейса SOAP. Теперь я должен создать утверждение XPath, чтобы проверить, есть ли в настоящее время изображение Red Hat, которое можно найти с помощью состояния операционной системы &. Но я не могу утверждать в SOAPUI на выходе.Справка по Xpath Query для xml

У вас есть предложения по этому вопросу?

Похоже, что разные пространства имен и один из URL не имеют имен, объявленное в XML xmlns="http://testlab.example.net/schemas/server"

XML приводится ниже:

<ServersWithState pageNumber="1" pageCount="2" totalCount="2" pageSize="250" 
    xmlns:ns16="http://testlab.example.net/schemas/storage" 
    xmlns="http://testlab.example.net/schemas/server" 
    xmlns:ns14="http://testlab.example.net/schemas/support" 
    xmlns:ns15="http://testlab.example.net/schemas/multigeo" 
    xmlns:ns9="http://testlab.example.net/schemas/admin" 
    xmlns:ns5="http://testlab.example.net/schemas/vip" 
    xmlns:ns12="http://testlab.example.net/schemas/serverbootstrap" 
    xmlns:ns13="http://testlab.example.net/schemas/backup" 
    xmlns:ns6="http://testlab.example.net/schemas/general" 
    xmlns:ns7="http://testlab.example.net/schemas/datacenter" 
    xmlns:ns10="http://testlab.example.net/schemas/whitelabel" 
    xmlns:ns8="http://testlab.example.net/schemas/manualimport" 
    xmlns:ns11="http://testlab.example.net/schemas/reset" 
    xmlns:ns2="http://testlab.example.net/schemas/directory" 
    xmlns:ns4="http://testlab.example.net/schemas/network" 
    xmlns:ns3="http://testlab.example.net/schemas/organization"> 
    <serverWithState id="d6fb8348-97ff-4169-a4f8-33ac12ecf6ff" location="Home_LAB"> 
     <name>test_server_windows</name> 
     <description/> 
     <operatingSystem id="WIN2008S32" displayName="WIN2008S/32" type="WINDOWS"/> 
     <cpuCount>2</cpuCount> 
     <memoryMb>4096</memoryMb> 
     <disk id="4ca8b248-573d-4210-819c-66c114ecea01" scsiId="0" sizeGb="32" speed="STANDARD" state="NORMAL"/> 
     <sourceImageId>fbf3ad74-2b69-49c8-9a37-f963b3102d2c</sourceImageId> 
     <networkId>9906ddd8-45aa-11e0-b7ea-0030487e0302</networkId> 
     <machineName>10-157-116-11</machineName> 
     <privateIp>10.157.116.11</privateIp> 
     <created>2014-09-25T17:24:52.000Z</created> 
     <isDeployed>true</isDeployed> 
     <isStarted>true</isStarted> 
     <state>NORMAL</state> 
     <machineStatus name="vmwareToolsVersionStatus"> 
     <value>NEED_UPGRADE</value> 
     </machineStatus> 
     <machineStatus name="vmwareToolsRunningStatus"> 
     <value>RUNNING</value> 
     </machineStatus> 
     <machineStatus name="vmwareToolsApiVersion"> 
     <value>7303</value> 
     </machineStatus> 
    </serverWithState> 
    <serverWithState id="ab271ab1-7daa-443b-bb21-a62e27a7b207" location="Home_LAB"> 
     <name>test_server_linux</name> 
     <description/> 
     <operatingSystem id="REDHAT564" displayName="REDHAT5/64" type="UNIX"/> 
     <cpuCount>1</cpuCount> 
     <memoryMb>2048</memoryMb> 
     <disk id="41516cdb-1010-44bd-ba6e-a00bd2340974" scsiId="0" sizeGb="10" speed="STANDARD" state="NORMAL"/> 
     <sourceImageId>0d6fdc8c-7529-4fb8-9028-8f133c7de2ae</sourceImageId> 
     <networkId>9906ddd8-45aa-11e0-b7ea-0030487e0302</networkId> 
     <machineName>10-157-116-12</machineName> 
     <privateIp>10.157.116.12</privateIp> 
     <created>2014-09-25T17:25:39.000Z</created> 
     <isDeployed>false</isDeployed> 
     <isStarted>false</isStarted> 
     <state>FAILED_ADD</state> 
     <status> 
     <action>DEPLOY_SERVER</action> 
     <requestTime>2014-09-25T17:25:39.000Z</requestTime> 
     <userName>autotest</userName> 
     <numberOfSteps>13</numberOfSteps> 
     <updateTime>2014-09-25T17:38:00.000Z</updateTime> 
     <step> 
      <name>WAIT_FOR_CLONE_VM_TASK</name> 
      <number>5</number> 
      <percentComplete>91</percentComplete> 
     </step> 
     <failureReason>Could not complete network copy for file /vmfs/volumes/4b215b8c-44971195-4262-001cc4478f4b/T-RHEL-53-64-1-2-10-LAB0x/T-RHEL-53-64-1-2-10-LAB0x.vmdk</failureReason> 
     </status> 
    </serverWithState> 
</ServersWithState> 
+1

Было бы полезно, если бы вы предоставили XPath утверждения, которые вы пытались использовать. –

+0

Спасибо за ваш быстрый ответ ... Вот некоторые утверждения, которые я пытаюсь использовать. // operatingSystem [@id], // operatingSystem [start-with (@ id, 'REDHAT') Кроме того, я попытался объявить пространства имен в утверждении XPATH и дал xmlns: ns1 = И затем утверждение, основанное на // ns1: operatingSystem [@id] –

ответ

1

boolean(//*[local-name()='operatingSystem'][starts-with(@id, 'REDHAT')]) должно работать. Вы должны использовать функцию local-name(), если вы не можете иначе указать пространство имен для использования - если вы хотите, чтобы сделать это в SoapUI вы можете сделать soemthing так:

declare namespace ns "http://testlab.example.net/schemas/server" 
boolean(//ns:operatingSystem[starts-with(@id, 'REDHAT')]) 

Если вам нужно, чтобы захватить дополнительный узел что (например state или isStarted), вы могли бы сделать что-то вроде этого:

declare namespace ns "http://testlab.example.net/schemas/server" 
boolean(//ns:operatingSystem[starts-with(@id, 'REDHAT') and ../ns:state='NORMAL']) 
+0

Спасибо, Дан! Ценю вашу помощь. Любая идея, как сделать утверждение xpath для условия вроде Нужно найти сервер REDHAT в указанном выше xml и проверить, запущен ли он? Можно ли это сделать в том же заявлении? –

+0

Нет проблем - если это разрешило ваш вопрос, подумайте о том, чтобы принять его как ответ (флажок под клавишей с кнопками голосования) –

+0

только что изменил мой ответ выше. Ищете что-то, если присутствует рабочая система REDHAT, тогда она работает? –

0

Я использую PHP для оценки XPath , но вы должны быть в состоянии превратить это в любом языке по своему выбору:

<?php 

$doc = new \DOMDocument(); 
$doc->load('in.xml'); 

$xpath = new \DOMXPath($doc); 
$xpath->registerNamespace('n', 'http://testlab.example.net/schemas/server'); 
$result = $xpath->evaluate("boolean(
//n:serverWithState 
    [starts-with(./n:operatingSystem/@id, 'REDHAT')] 
    [./n:isStarted = 'true'] 
)"); 

var_dump($result); 

Это выводит bool(false) для примера и bool(true), если вы измените значение isStarted на true.

+0

Не уверен, что могу это использовать. –

0

Если элемент не имеет пространства имен, он наследует пространство имен от родителя. Для SoapUI утверждений - чтение XML - вы можете использовать маску для имен, например, так:

//*:operatingSystem[starts-with(@id, 'REDHAT')] 

EDIT: Чтобы проверить state в утверждении SoapUI, ваше выражение XPath будет:

//*:operatingSystem[starts-with(@id, 'REDHAT')]/*:state 

и ожидаемое значение будет:

NORMAL 
+0

Спасибо SiKing за ваш ответ .. Просто интересно, как я могу использовать идентификатор операционной системы для REDHAT, а затем в этом состоянии использования, чтобы проверить, что NORMAL является истинным? –

+0

@RahulGupta добавлена ​​информация – SiKing

+0

Спасибо, Siking, действительно ценю ваш ответ. Но почему-то кажется обязательным объявлять пространство имен в SOAPUI, о котором упоминалось Dan. Спасибо за помощь. –

0

@RahulGupta: Попробуйте это, он должен работать ---

//*:serverWithState[*:operatingSystem[starts-with(@id, 'REDHAT')]]/*:state

-> if you specify * in xpath no need to declare namespace in soapUI 
Смежные вопросы