【问题标题】:Groovy Get value of an XML attribute with GPath SlurperGroovy 使用 GPath Slurper 获取 XML 属性的值
【发布时间】:2017-11-01 11:39:49
【问题描述】:

需要解析包含标题上下文中属性的 XML 文档。

<?xml version="1.0" encoding="UTF-8"?>
<S38:manageRequest xmlns:S38="http://ns.com/S38" xmlns:header="http://ns.com/header/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://ns.com/xsd/ManageItem XSD\ManageItem.xsd">
    <header:standardHeader>
        <header:serviceAddressing>
            <header:to>
                <header:address>http://ns.com/BLAHBLAH</header:address>
                <header:contextItemList>
                    <header:contextItem contextName="Channel" contextId="http://ns.com/contextItem">I Need This</header:contextItem>
                    <header:contextItem contextName="Box" contextId="http://ns.com/contextItem">Blue</header:contextItem>
                </header:contextItemList>
            </header:to>
        </header:serviceAddressing>
    </header:standardHeader>
</S38:manageRequest>

我想使用groovy.util.slurpersupport.GPathResult 获取“我需要这个”的属性“频道”值。

我找到了一种可行的方法,但我不相信它是正确的,因为我选择了contextItem,幸运的是第一个是我感兴趣的:

private Map parseServiceAddressing(GPathResult message,Map values){ 
def serviceAddressingList=message."standardHeader"."serviceAddressing"."to"."contextItemList";
    if(serviceAddressingList.isEmpty()){ 
    throw new sourceException("serviceAddressing list is missing",values);
}

def contextItem=serviceAddressingList.'*'.find{
    it.name()=='contextItem'
    };

values.put(tag.CHANNEL, contextItem);

return values;

所有使用Channel 作为位置文本的尝试都未能检索到值。不幸的是,我被束缚在使用 GPath 作为一个非常大的 Groovy 脚本的一部分,我被要求修改它做很多其他的事情。

有人可以告诉我实现这一目标的正确方法是什么吗?

【问题讨论】:

    标签: xml groovy xmlslurper gpath


    【解决方案1】:

    您应该使用元素名称找到它,并且元素属性与请求值匹配,如下所示:

    def xmlString = """<?xml version="1.0" encoding="UTF-8"?>
    <S38:manageRequest xmlns:S38="http://ns.com/S38" xmlns:header="http://ns.com/header/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://ns.com/xsd/ManageItem XSD/ManageItem.xsd">
        <header:standardHeader>
            <header:serviceAddressing>
                <header:to>
                    <header:address>http://ns.com/BLAHBLAH</header:address>
                    <header:contextItemList>
                        <header:contextItem contextName="Channel" contextId="http://ns.com/contextItem">I Need This</header:contextItem>
                        <header:contextItem contextName="Box" contextId="http://ns.com/contextItem">Blue</header:contextItem>
                    </header:contextItemList>
                </header:to>
            </header:serviceAddressing>
        </header:standardHeader>
    </S38:manageRequest>"""
    
    
    def xml = new XmlSlurper().parseText(xmlString)
    def cItemChannel = xml.'**'.find {it.name() == 'contextItem' && it.@contextName == 'Channel'}?.text()
    println cItemChannel
    

    大家可以在线快速试用demo

    【讨论】:

    • 这真是一种享受,我知道有办法确保我得到正确的价值。感谢您的帮助!
    • @Plasma,很高兴它有帮助。
    • 谢谢!这很简单 - 我尝试迭代但没有运气......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-26
    相关资源
    最近更新 更多