2012-02-22 102 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

相關問題