首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XmlSlurper:使用命名空间更改元素中的文本

XmlSlurper:使用命名空间更改元素中的文本
EN

Stack Overflow用户
提问于 2012-01-13 18:05:15
回答 1查看 1.3K关注 0票数 2

我不明白为什么xml."con:cred"."ser:user" = "modified_username"不改变文本。有人能解释一下吗?

代码语言:javascript
复制
input = """
<kuk:acc xmlns:kuk="kuk">
    <con:cred xmlns:con="http://www.bea.com/wli/sb/resources/config">
        <ser:user xmlns:ser="http://www.bea.com/wli/sb/services">username</ser:user>
    </con:cred>
</kuk:acc>
"""

def xml = new XmlSlurper(keepWhitespace:true).parseText(input).declareNamespace(
    ser:"http://www.bea.com/wli/sb/services",
    con:"http://www.bea.com/wli/sb/resources/config")
println xml."con:cred"."ser:user" 

xml."con:cred"."ser:user" = "modified_username" // That doesn't work
println xml."con:cred"."ser:user" 

xml.cred.user = "modified_username" // That works
println xml."con:cred"."ser:user" 

/*
def outputBuilder = new StreamingMarkupBuilder() 
String result = outputBuilder.bind{ mkp.yield xml }
println result
*/
EN

回答 1

Stack Overflow用户

发布于 2012-01-16 19:56:15

我已经在这个问题上钻研了一段时间,也正要问同样的问题。假设在使用重载的'=‘运算符时调用的方法是putAt(int,Object),请仔细查看GPathResult code

代码语言:javascript
复制
public void putAt(final int index, final Object newValue) {
    final GPathResult result = (GPathResult)getAt(index);

    if (newValue instanceof Closure) {
        result.replaceNode((Closure)newValue);
    } else {
        result.replaceBody(newValue);
    }
}

显示应该调用replaceBody。正如*tim_yates*指出的,replaceBody工作得很好,所以似乎调用了replaceNode (我不明白为什么)。深入研究NodeChildren's replaceNode,我们可以看到

代码语言:javascript
复制
protected void replaceNode(final Closure newValue) {
    final Iterator iter = iterator();
    while (iter.hasNext()) {
        final NodeChild result = (NodeChild) iter.next();
        result.replaceNode(newValue);
    }
}

闭包永远不会被调用,因此在调用replaceNode时不会执行任何操作。所以我认为replaceNode中有一个bug (它什么也不做),并且当执行xml."con:cred"."ser:user" = "modified_username"时,表达式的右边部分被计算为闭包(这一点我需要帮助来理解为什么:-)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8848794

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档