2012-08-14 90 views
1

JAXB對象是使用Eclipse生成的,然後我一直在嘗試對它進行調整。使用JAXB將XML文檔嵌入到另一個XML中

我想和JAXB得到這個:

</RootElement xmlns="http://example.com/rootElement"> 
    <Body> 
     <OtherRoot xmlns="http://example.com/OtherRoot"> 
      <CompanyName>Google</CompanyName> 
      <DataSet>online</DataSet> 
     </OtherRoot> 
    </Body> 
</RootElement> 

但我已經設法做的是:

</RootElement xmlns="http://example.com/rootElement" 
    xmlns:n2="http://example.com/OtherRoot"> 
    <Body> 
     <ns2:OtherRoot> 
      <ns2:CompanyName>Goolge</ns2:CompanyName> 
      <n2:DataSet>online</n2:DataSet> 
     </ns2:OtherRoot> 
    </Body> 
</RootElement> 

這並不理想。什麼是獲得理想結果的最佳方式?

+2

這兩個XML樣本是等價的,所以第二個不應該是一個問題。 – artbristol 2012-08-14 15:25:34

+1

檢查我的答案之一類似的問題,它應該幫助:http://stackoverflow.com/a/5722013/383861 – 2012-08-14 15:36:23

+0

這似乎做了一些調整的伎倆 – pablisco 2012-08-14 16:48:00

回答

1

感謝Blaise提及他以前的答案。最後我用類似的方法:

這是我截取了作家:

StringWriter writer = new StringWriter(); 
XMLOutputFactory factory = XMLOutputFactory.newFactory(); 
XMLWriter xmlWriter = new XMLWriter(factory.createXMLStreamWriter(writer)); 
marshaller.marshal(message, xmlWriter); 

這裏是XMLWriter的類:

import java.util.Iterator; 

import javax.xml.namespace.NamespaceContext; 
import javax.xml.stream.XMLStreamException; 
import javax.xml.stream.XMLStreamWriter; 

public class XMLWriter implements XMLStreamWriter { 

private XMLStreamWriter writer; 

private ProxyNameSpaceContext nc = new ProxyNameSpaceContext(); 

public XMLWriter(XMLStreamWriter writer) throws XMLStreamException { 
    super(); 
    this.writer = writer; 
    writer.setNamespaceContext(nc); 
} 

@Override 
public void close() throws XMLStreamException { 
    writer.close(); 
} 

@Override 
public void flush() throws XMLStreamException { 
    writer.flush(); 
} 

@Override 
public NamespaceContext getNamespaceContext() { 
    return writer.getNamespaceContext(); 
} 

@Override 
public String getPrefix(String uri) throws XMLStreamException { 
    return writer.getPrefix(uri); 
} 

@Override 
public Object getProperty(String name) throws IllegalArgumentException { 
    return writer.getProperty(name); 
} 

@Override 
public void setDefaultNamespace(String uri) throws XMLStreamException { 
    writer.setDefaultNamespace(uri); 
} 

@Override 
public void setNamespaceContext(NamespaceContext context) 
     throws XMLStreamException { 
} 

@Override 
public void setPrefix(String prefix, String uri) throws XMLStreamException { 
    writer.setPrefix(prefix, uri); 
} 

@Override 
public void writeAttribute(String prefix, String namespaceURI, 
     String localName, String value) throws XMLStreamException { 
    writer.writeAttribute(prefix, namespaceURI, localName, value); 
} 

@Override 
public void writeAttribute(String namespaceURI, String localName, 
     String value) throws XMLStreamException { 
    writer.writeAttribute(namespaceURI, localName, value); 
} 

@Override 
public void writeAttribute(String localName, String value) 
     throws XMLStreamException { 
    writer.writeAttribute(localName, value); 
} 

@Override 
public void writeCData(String data) throws XMLStreamException { 
    writer.writeCData(data); 
} 

@Override 
public void writeCharacters(char[] text, int start, int len) 
     throws XMLStreamException { 
    writer.writeCharacters(text, start, len); 
} 

@Override 
public void writeCharacters(String text) throws XMLStreamException { 
    writer.writeCharacters(text); 
} 

@Override 
public void writeComment(String data) throws XMLStreamException { 
    writer.writeComment(data); 
} 

@Override 
public void writeDTD(String dtd) throws XMLStreamException { 
    writer.writeDTD(dtd); 
} 

@Override 
public void writeDefaultNamespace(String namespaceURI) 
     throws XMLStreamException { 
    writer.writeDefaultNamespace(namespaceURI); 
} 

@Override 
public void writeEmptyElement(String prefix, String localName, 
     String namespaceURI) throws XMLStreamException { 
    writer.writeEmptyElement(prefix, localName, namespaceURI); 
} 

@Override 
public void writeEmptyElement(String namespaceURI, String localName) 
     throws XMLStreamException { 
    writer.writeEmptyElement(namespaceURI, localName); 
} 

@Override 
public void writeEmptyElement(String localName) throws XMLStreamException { 
    writer.writeEmptyElement(localName); 
} 

@Override 
public void writeEndDocument() throws XMLStreamException { 
    writer.writeEndDocument(); 
} 

@Override 
public void writeEndElement() throws XMLStreamException { 
    writer.writeEndElement(); 
} 

@Override 
public void writeEntityRef(String name) throws XMLStreamException { 
    writer.writeEntityRef(name); 
} 

@Override 
public void writeNamespace(String prefix, String namespaceURI) 
     throws XMLStreamException { 
    writer.writeNamespace(prefix, namespaceURI); 
} 

@Override 
public void writeProcessingInstruction(String target, String data) 
     throws XMLStreamException { 
    writer.writeProcessingInstruction(target, data); 
} 

@Override 
public void writeProcessingInstruction(String target) 
     throws XMLStreamException { 
    writer.writeProcessingInstruction(target); 
} 

@Override 
public void writeStartDocument() throws XMLStreamException { 
    writer.writeStartDocument(); 
} 

@Override 
public void writeStartDocument(String encoding, String version) 
     throws XMLStreamException { 
    writer.writeStartDocument(encoding, version); 
} 

@Override 
public void writeStartDocument(String version) throws XMLStreamException { 
    writer.writeStartDocument(version); 
} 

@Override 
public void writeStartElement(String prefix, String localName, 
     String namespaceURI) throws XMLStreamException { 
    writer.writeStartElement("", localName, namespaceURI); 
    if(null != namespaceURI && namespaceURI.length() > 0) { 
     String currentDefaultNS = nc.getNamespaceURI(""); 
     if(!namespaceURI.equals(currentDefaultNS)) { 
      writeDefaultNamespace(namespaceURI); 
      nc.setDefaultNS(namespaceURI); 
     } 
    } 
} 

@Override 
public void writeStartElement(String namespaceURI, String localName) 
     throws XMLStreamException { 
    writer.writeStartElement(namespaceURI, localName); 
} 

@Override 
public void writeStartElement(String localName) throws XMLStreamException { 
    writer.writeStartElement(localName); 
} 

public static class ProxyNameSpaceContext implements NamespaceContext { 

    private String defaultNS = ""; 

    public void setDefaultNS(String ns) { 
     defaultNS = ns; 
    } 

    @Override 
    public String getNamespaceURI(String prefix) { 
     if("".equals(prefix)) { 
      return defaultNS; 
     } 
     return null; 
    } 

    @Override 
    public String getPrefix(String namespaceURI) { 
     return ""; 
    } 

    @Override 
    public Iterator<?> getPrefixes(String namespaceURI) { 
     return null; 
    } 

} 

} 
相關問題