groovy解析xml语法真是很方便,同使用W3C DOM、dom4j、JDOM比起来确实是减少了不少冗余代码,代码看起来更通俗易懂。
XML生成提供了MarkupBuilder、StreamingMarkupBuilder类
<langs type="current"> <language>Java</language> <language>Groovy</language> <language>JavaScript</language> </langs>
使用XmlParser进行xml解析
def langs = new XmlParser().parse("languages.xml") println "type = ${langs.attribute("type")}" langs.language.each{ println it.text() } //output: type = current Java Groovy JavaScript
当然,如果解析的是xml格式的字符串,XmlParser也提供了方法来解析,但如果java代码进行解析还需要将xml变量中的特殊符号进行转义,更重要的是还需要将字符串流化后才能进行解析。
def xml = """ <langs type="current"> <language>Java</language> <language>Groovy</language> <language>JavaScript</language> </langs> """ def langs = new XmlParser().parseText(xml) println "type = ${langs.attribute("type")}" langs.language.each{ println it.text() }
XML构建:
使用MarkupBuilder进行xml解析:
def xml = new groovy.xml.MarkupBuilder() xml.langs(type:"current"){ language("Java") language("Groovy") language("JavaScript") } output: <langs type='current'> <language>Java</language> <language>Groovy</language> <language>JavaScript</language> </langs>
MarkupBuilder
非常适合用于同步构建简单的 XML 文档。对于更加高级的 XML 创建,Groovy 提供了一个 StreamingMarkupBuilder
。通过它,您可以添加各种各样的 XML 内容,比如说处理指令、名称空间和使用 mkp
帮助对象的未转义文本(非常适合 CDATA
块)
def comment = "<![CDATA[<!-- address is new to this release -->]]>" def builder = new groovy.xml.StreamingMarkupBuilder() builder.encoding = "UTF-8" def person = { mkp.xmlDeclaration() mkp.pi("xml-stylesheet": "type='text/xsl' href='myfile.xslt'" ) mkp.declareNamespace('':'http://myDefaultNamespace') mkp.declareNamespace('location':'http://someOtherNamespace') person(id:100){ firstname("Jane") lastname("Doe") mkp.yieldUnescaped(comment) location.address("123 Main") } } def writer = new FileWriter("person.xml") writer << builder.bind(person) //output: <?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type='text/xsl' href='myfile.xslt'?> <person id='100' xmlns='http://myDefaultNamespace' xmlns:location='http://someOtherNamespace'> <firstname>Jane</firstname> <lastname>Doe</lastname> <![CDATA[<!-- address is new to this release -->]]> <location:address>123 Main</location:address> </person>