Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在XMLParser对象Groovy中真正删除节点_Xml_Groovy_Xml Parsing - Fatal编程技术网

在XMLParser对象Groovy中真正删除节点

在XMLParser对象Groovy中真正删除节点,xml,groovy,xml-parsing,Xml,Groovy,Xml Parsing,如何通过XMLParser真正删除节点: x='''<X> <A> <B c3='1'> <C1>a</C1> <C2>b</C2> </B> <B c3='2'> <C1>e</C1> <C2>e</C2> </B> <B c3='3'> <C1>f</C1

如何通过XMLParser真正删除节点:

 x='''<X>
<A>
 <B c3='1'>
   <C1>a</C1>
   <C2>b</C2>
 </B>
 <B c3='2'>
   <C1>e</C1>
   <C2>e</C2>
 </B>
 <B c3='3'>
   <C1>f</C1>
   <C2>f</C2>
 </B>
</A>
</X>
'''

xml=new XmlParser().parseText(x)
def nodeToDel=xml.A.B.find{it.@C1='a'}
xml.remove(nodeToDel)
println xml
new XmlNodePrinter(new PrintWriter(new FileWriter(new File('c:/temp/a.xml')))).print(xml)
结果属性c3的第一部分更改为3?!?!?!?!?wtf

我现在正在努力寻找一个解决方案一个星期了,这是相当累人的


有人有主意吗?

删除节点的工作原理与其他DOM API非常相似。必须将要删除的节点传递给其父节点的remove方法

另外,
=
运算符是Groovy中的赋值运算符
it.@C1='a'
'a'
分配给文档中每个
B
节点的
C1
属性。由于该赋值的结果是
'a'
,Groovy将其强制为
true
find
将始终返回它遇到的第一个节点

xml=new XmlParser().parseText(x)
def nodeToDel=xml.A.B.C1.find { it.text() == 'a' }
def parent = nodeToDel.parent()
parent.remove(nodeToDel)

通过一个完整的工作示例改进Justin Piper的解决方案:

def xml = new XmlParser().parseText('''
    <root>
        <element id="10" />
        <element id="20" />
    </root>
''')
def nodeToDel = xml.find { it["@id"] == '20' }

if (nodeToDel) {
    nodeToDel.parent().remove(nodeToDel)
}

println xml
def xml=new XmlParser().parseText(“”)
''')
def nodeToDel=xml.find{it[“@id”]=='20'}
if(nodeToDel){
nodeToDel.parent().remove(nodeToDel)
}
println-xml

此示例仅在您希望使用C1='a'取消编码时有效。但是当你想删除C1='e'时,它不起作用,例如。。。它似乎只删除了第一个条目。。我想每个人都会假设只是把“a”改成“e”,但你会发现它不起作用。。。o请告诉我,你也得到了错误的结果。我使用了以下代码:
xml=new-XmlParser().parseText(x)def-nodeToDel=xml.A.B.find{it@C1='e'}def-parent=nodeToDel.parent()parent.remove(nodeToDel)new-xmlodeprinter(new-PrintWriter)(new-FileWriter(new-File('c:/temp/A.xml')))).print(xml)
我看到问题了。我重点讨论了如何实际删除节点的问题,但是GPath表达式也不正确,只是碰巧生成了所需的结果,因为它要查找的节点恰好是第一个节点。我已经更新了我的答案。让我知道这是否更有效。谢谢champ,它有效。。。我已经对=感到好奇,这也解释了为什么xml中有一个新属性。。现在我得到了需要的结果。唯一一件事我还不明白,它现在是如何与属性一起工作的:
我会假设
它。@'c3'='3'
但是这不起作用,也不适用于
.text()
它们如果你在做
xml.A.B.C1.查找
那么在闭包
中它应该只有C1个元素
xml.A.B.find{it.@c3=='3'}
应该找到第一个具有值为3的c3属性的B元素。
def xml = new XmlParser().parseText('''
    <root>
        <element id="10" />
        <element id="20" />
    </root>
''')
def nodeToDel = xml.find { it["@id"] == '20' }

if (nodeToDel) {
    nodeToDel.parent().remove(nodeToDel)
}

println xml