我想使用groovy删除所有空节点
这是xml,我想删除电话和团队
<Profile>
<Name>Fin</Name>
<Aga>20</Aga>
<Contact>
<Mobile>1819</Mobile>
<Telephone/>
</Contact>
<Team>
<Team1/>
<Team2/>
</Team>
</Profile>
这是我的代码。
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import groovy.xml.*
boolean cleanNode( def node ) {
node.value().with { a ->
a.findAll { !it.value }.each { a.remove( it.key ) }
}
node.children().with { kids ->
kids.findAll { it instanceof Node ? !cleanNode( it ) : false }
.each { kids.remove( it ) }
}
node.attributes() || node.children() || node.text()
}
static main(args) {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder parser = factory.newDocumentBuilder();
Document xmlDoc = parser.parse("C:/Users/Myuser/Desktop/Testxml2.xml");//file has the xml*/
String xml = nodeToString(xmlDoc.getDocumentElement());
def root = new XmlParser().parseText( xml );
cleanNode(root)
def test = XmlUtil.serialize(root);
println test;
}
static String nodeToString(Node node) {
StringWriter sw = new StringWriter();
try {
Transformer t = TransformerFactory.newInstance().newTransformer();
t.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
t.setOutputProperty(OutputKeys.INDENT, "yes");
t.transform(new DOMSource(node), new StreamResult(sw));
} catch (TransformerException te) {
System.out.println("nodeToString Transformer Exception");
}
return sw.toString();
}
但这不起作用,因为电话和团队未被删除
这是输出
<Profile>
<Name>Fin</Name>
<Aga>20</Aga>
<Contact>
<Mobile>1819</Mobile>
<Telephone/>
</Contact>
<Team>
<Team1/>
<Team2/>
</Team>
</Profile>
这是预期结果
<Profile>
<Name>Fin</Name>
<Aga>20</Aga>
<Contact>
<Mobile>1819</Mobile>
</Contact>
</Profile>
你能告诉我这个吗?
答案 0 :(得分:1)
您可以按照以下说明进行操作:
def xmlString = """<Profile>
<Name>Fin</Name>
<Aga>20</Aga>
<Contact>
<Mobile>1819</Mobile>
<Telephone/>
</Contact>
<Team>
<Team1/>
<Team2/>
</Team>
</Profile>"""
def xml = new XmlParser().parseText(xmlString)
def nodes = xml.'**'.findAll{it.name() && !it.text()}
def removeNode = { node ->
def parent = node.parent()
parent.remove(node)
}
nodes.each{removeNode(it)}
println groovy.xml.XmlUtil.serialize(xml)
你也可以快速尝试相同的在线 demo