[英]Add node to the XML if does not exist?
我有以下问题。 如果节点不可用,我需要添加一个节点。 例如
输入:
<DataTable>
<DataRow>
<Field1>1</Field1>
</DataRow>
<DataRow>
<Field1>1</Field1>
<Field2>1</Field2>
</DataRow>
<DataRow>
<Field1>1</Field1>
<Field2>1</Field2>
<Field3>1</Field3>
</DataRow>
</DataTable>
预计 output:
<DataTable>
<DataRow>
<Field1>1</Field1>
<Field2/>
<Field3/>
</DataRow>
<DataRow>
<Field1>1</Field1>
<Field2>1</Field2>
<Field3/>
</DataRow>
<DataRow>
<Field1>1</Field1>
<Field2>1</Field2>
<Field3>1</Field3>
</DataRow>
</DataTable>
因此,如果一行中的三个节点不可用,则应将它们添加到结果 XML 中。
这是我试过的代码,它只适用于平面 xml。
import com.sap.gateway.ip.core.customdev.util.Message
import groovy.xml.XmlUtil
Message processData(Message message) {
def fields = ['Field1', 'Field2', 'Field3']
def payload = new XmlParser().parse(message.getBody(Reader))
(fields - (payload.children() as List<Node>)*.name()).each { payload.appendNode(it) }
message.setBody(XmlUtil.serialize(payload))
return message
}
我想将 Tag 添加到 output 文件中。 谢谢
因此,对于转换,我们可以编写一个 function,它接受一个字符串(输入 xml)和一个必填字段列表,并返回新的 xml
import groovy.xml.XmlParser
import groovy.xml.XmlNodePrinter
String extendFields(String xmlInput, List<String> fields) {
def xml = new XmlParser().parseText(xmlInput)
xml.findAll { it.name() == 'DataRow' }.each { row ->
fields.each { field ->
if (!row."$field") {
row.appendNode(field)
}
}
}
new StringWriter().with { out ->
new XmlNodePrinter(new PrintWriter(out)).with { writer ->
writer.preserveWhitespace = true
writer.print(xml)
}
out.toString()
}
}
使用您的输入 XML 调用它:
def input = '''<DataTable>
<DataRow>
<Field1>1</Field1>
</DataRow>
<DataRow>
<Field1>1</Field1>
<Field2>1</Field2>
</DataRow>
<DataRow>
<Field1>1</Field1>
<Field2>1</Field2>
<Field3>1</Field3>
</DataRow>
</DataTable>'''
println extendFields(input, ['Field1', 'Field2', 'Field3'])
印刷
<DataTable>
<DataRow>
<Field1>1</Field1>
<Field2/>
<Field3/>
</DataRow>
<DataRow>
<Field1>1</Field1>
<Field2>1</Field2>
<Field3/>
</DataRow>
<DataRow>
<Field1>1</Field1>
<Field2>1</Field2>
<Field3>1</Field3>
</DataRow>
</DataTable>
那么,您可以更改问题中的方法以调用此新方法:
Message processData(Message message) {
def fields = ['Field1', 'Field2', 'Field3']
def payload = extendFields(message.getBody(Reader), fields)
message.setBody(payload)
return message
}
将其提取到单独的方法中还具有使其更易于测试的优点
如果你想按照你提供的字段的顺序对节点进行排序,你可以像这样在children
节点上添加一个sort
:
String extendFields(String xmlInput, List<String> fields) {
def xml = new XmlParser().parseText(xmlInput)
xml.findAll { it.name() == 'DataRow' }.each { row ->
fields.each { field ->
if (!row."$field") {
row.appendNode(field)
}
}
row.children().sort { fields.indexOf(it.name()) }
}
new StringWriter().with { out ->
new XmlNodePrinter(new PrintWriter(out)).with { writer ->
writer.preserveWhitespace = true
writer.print(xml)
}
out.toString()
}
}
然后按照我们想要的顺序使用字段调用它:
println extendFields(input, ['Field3', 'Field1', 'Field2'])
印刷:
<DataTable>
<DataRow>
<Field3/>
<Field1>1</Field1>
<Field2/>
</DataRow>
<DataRow>
<Field3/>
<Field1>1</Field1>
<Field2>1</Field2>
</DataRow>
<DataRow>
<Field3>1</Field3>
<Field1>1</Field1>
<Field2>1</Field2>
</DataRow>
</DataTable>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.