gpt4 book ai didi

groovy - 使用 Groovy 中的命名空间正确迭代 XML

转载 作者:行者123 更新时间:2023-12-04 16:54:00 26 4
gpt4 key购买 nike

我有以下xml代码:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>
<cms:RelatedConfigurationItemList xmlns:cms="some namespace">
<ConfigurationItem>
<name>data</name>
<id>data</id>
<type>data</type>
<relationship>IS CHILD OF</relationship>
<ConfigurationItemList>
<ConfigurationItem>
<name>data</name>
<id>data</id>
<type>data</type>
<relationship>IS CHILD OF</relationship>
<ConfigurationItemList/>
</ConfigurationItem>
<ConfigurationItem>
<name>data</name>
<id>data</id>
<type>data</type>
<relationship>IS CHILD OF</relationship>
<ConfigurationItemList/>
</ConfigurationItem>
</ConfigurationItemList>
</ConfigurationItem>
<ConfigurationItem>
<name>other data</name>
<id>other data</id>
<type>other data</type>
<relationship>IS CHILD OF</relationship>
<ConfigurationItemList>
<ConfigurationItem>
<name>other data</name>
<id>other data</id>
<type>other data</type>
<relationship>IS CHILD OF</relationship>
<ConfigurationItemList/>
</ConfigurationItem>
<ConfigurationItem>
<name>other data</name>
<id>other data</id>
<type>other data</type>
<relationship>IS CHILD OF</relationship>
<ConfigurationItemList/>
</ConfigurationItem>
</ConfigurationItemList>
</ConfigurationItem>
</cms:RelatedConfigurationItemList>
</soapenv:Body>
</soapenv:Envelope>

我想使用以下伪代码在 Groovy 中进行验证:
def request = testRunner.testCase.getTestStepByName( "relationship_request" )
def resp = new File('H://test_xml.xml')
def cms_ns = new groovy.xml.Namespace("namespace for cms",'cms')
def soap_ns = new groovy.xml.Namespace("http://schemas.xmlsoap.org/soap/envelope/",'soapenv')
def root = new XmlSlurper().parse(resp)


def config_item = root[soap_ns.Envelope][soap_ns.Body][cms_ns.RelatedConfigurationItemList][ConfigurationItem]

config_item.each{
it.name.each{
it == corresponding value in db?
else
die
}
}

但是我似乎无法获得正确的语法和逻辑来尝试验证针对数据库响应定义的值(例如名称)。如果 config_item 声明是正确的,那么可能我对 Groovy 闭包的理解很差。另外,我不确定 XML slurper 或解析器是否更合适,并且不能完全确定差异到底是什么。希望这是对问题的充分描述。

最佳答案

XmlSlurper 按需工作,占用的内存较少。当需要访问xml的多个节点时,一般使用一个XmlParser。或者,如果您只想读取 xml 的一两个节点,则可以使用 Slurper。

This example应该可以帮助您了解 XMLParser 的工作原理。

在您的情况下,配置项声明和命名空间使用在语法上是正确的,但使用 XmlParser 可能是理想的,因为您可能正在验证 xml 的许多或所有组件。您可能对使用闭包访问元素感到困惑。这是您没有命名空间的示例以帮助您理解。

   xml = '''<Envelope>
<Body>
<RelatedConfigurationItemList>
<ConfigurationItem>
<name>Top level name1</name>
<id>Top level id1</id>
<type>Top level type1</type>
<relationship>IS CHILD OF</relationship>
<ConfigurationItemList>
<ConfigurationItem>
<name>data1</name>
<id>data1</id>
<type>data1</type>
<relationship>IS CHILD OF</relationship>
<ConfigurationItemList/>
</ConfigurationItem>
<ConfigurationItem>
<name>data2</name>
<id>data2</id>
<type>data2</type>
<relationship>IS CHILD OF</relationship>
<ConfigurationItemList/>
</ConfigurationItem>
</ConfigurationItemList>
</ConfigurationItem>
<ConfigurationItem>
<name>Top level name2</name>
<id>Top level id2</id>
<type>Top level type2</type>
<relationship>IS CHILD OF</relationship>
<ConfigurationItemList>
<ConfigurationItem>
<name>other data</name>
<id>other data</id>
<type>other data</type>
<relationship>IS CHILD OF</relationship>
<ConfigurationItemList/>
</ConfigurationItem>
<ConfigurationItem>
<name>other data</name>
<id>other data</id>
<type>other data</type>
<relationship>IS CHILD OF</relationship>
<ConfigurationItemList/>
</ConfigurationItem>
</ConfigurationItemList>
</ConfigurationItem>
</RelatedConfigurationItemList>
</Body>
</Envelope>'''



def Envelope = new XmlParser().parseText(xml)

//For accessing top level top level Configuration Item
Envelope.Body.RelatedConfigurationItemList.ConfigurationItem.each{
//Put your check conditions here.. == or any other
assert it.name.text().contains("Top level name")
assert it.id.text().contains("Top level id")
assert it.type.text().contains("Top level type")
//Inner children configuration items
it.ConfigurationItemList.ConfigurationItem.each{
assert it.name.text().contains("data")
assert it.id.text().contains("data")
assert it.type.text().contains("data")
}
}

关于groovy - 使用 Groovy 中的命名空间正确迭代 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11620465/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com