2012-02-22 101 views
0

我有一个XSD,其根元素包含两个未在随后的模式定义中使用的名称空间声明,例如xmlns:foo="urn:bar"其中未使用foo。XmlSlurper或StreamingMarkupBuilder剥离名称空间

当我使用的XmlSlurper和StreamingMarkupBuilder阅读并再次将其未修改写出来:

import groovy.xml.MarkupBuilder 
import groovy.xml.StreamingMarkupBuilder 

public class NS { 
    public static main(String[] args) { 
     File xsdFile = new File("A.xsd") 
     XmlSlurper slurper = new XmlSlurper() 

     def xml = slurper.parse(xsdFile) 
     def outputBuilder = new StreamingMarkupBuilder() 
     String xmlStr = outputBuilder.bind { mkp.yield xml } 

     println xmlStr 
    } 
} 

它是剥离这些命名空间声明。我怎样才能让这些XML完全按照原样读写XML?

回答

1

制作XmlSlurper没有名称空间感知的via the constructor似乎给你所需要的结果:

import groovy.xml.MarkupBuilder 
import groovy.xml.StreamingMarkupBuilder 
import groovy.xml.XmlUtil 

def xsd = '''<?xml version="1.0" encoding="UTF-8"?> 
      |<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
      |   xmlns:foo="http://www.example.com/foo"> 
      | <xsd:simpleType name="Severity"> 
      |  <xsd:restriction base="xsd:string"> 
      |  <xsd:enumeration value="pass"/> 
      |  <xsd:enumeration value="fail"/> 
      |  <xsd:enumeration value="error"/> 
      |  </xsd:restriction> 
      | </xsd:simpleType> 
      |</xsd:schema>'''.stripMargin() 

def xml = new XmlSlurper(false, false).parseText(xsd) 
def outputBuilder = new StreamingMarkupBuilder() 
String xmlStr = XmlUtil.serialize(outputBuilder.bind { mkp.yield xml }) 
println xmlStr 
+0

谢谢!这工作! – 2012-02-23 00:22:00

相关问题