2017-03-05 2 views
1

大きなXMLファイルを作成するために、StAX APIを使用することにしました。基本的な構造は、低レベルのAPI createStartDocument()、createStartElement()を使用して構築されます。これは期待どおりに動作します。既に文書の開始を作成したXmlEventWriter(StAX)にXML(String)を追加する方法

ただし、String(データベースから取得)に存在する既存のXMLデータを追加する場合があります。

  • Woodstox::次の例外がスローされます。「出力XMLができない実装によっては、我々が期待した結果を取得されていません、上記のコードでは

    import java.lang.*; 
    import java.io.*; 
    import javax.xml.stream.*; 
    
    public class Example { 
        public static void main(String... args) throws XMLStreamException { 
         XMLOutputFactory outputFactory = XMLOutputFactory.newInstance(); 
         XMLInputFactory inputFactory = XMLInputFactory.newInstance(); 
         XMLEventFactory eventFactory = XMLEventFactory.newInstance(); 
    
         StringWriter writer = new StringWriter(); 
         XMLEventWriter eventWriter = outputFactory.createXMLEventWriter(writer); 
    
         eventWriter.add(eventFactory.createStartDocument("UTF-8", "1.0")); 
         eventWriter.add(eventFactory.createStartElement("ns0", "http://example.org", "root")); 
         eventWriter.add(eventFactory.createNamespace("ns0", "http://example.org")); 
    
         //In here, we want to append a piece of XML which is stored in a string variable. 
         String xml = "<fragments><fragment><data>This is pure text.</data></fragment></fragments>"; 
         eventWriter.add(inputFactory.createXMLEventReader(new StringReader(xml))); 
    
         eventWriter.add(eventFactory.createEndDocument()); 
    
         System.out.println(writer.toString()); 
        } 
    } 
    

    :次のスニペットは、このことを示しています宣言、出力は既に完了しています。 XMLEventReaderはstartDocumentイベントで開始されたようですが、startDocumentイベントはプログラム的に既にトリガーされているため、エラーがスローされます。

  • JDK:それは<?xml version="1.0" ... <fragments><fragment>...を追加します - これは無効なXMLにつながります。

私も使用して、XMLを追加することを試みた:

eventFactory.createCharacters(xml); 

ここでの問題は、XMLが添付されていても、<および>を& LTおよび& GTに変換されることです。したがって、無効なXMLが返されます。

私は単にXMLとしてStringを追加できるAPIがありませんか?

答えて

2

必要な場合は、最初にどのStartDocumentを消費することができます

String xml = "<fragments><fragment><data>This is pure text.</data></fragment></fragments>"; 
    XMLEventReader xer = inputFactory.createXMLEventReader(new StringReader(xml)); 
    if (xer.peek().isStartDocument()) 
    { 
     xer.nextEvent(); 
    } 
    eventWriter.add(xer); 
+0

あなたは真のライブセーバーです!それが私の目の前にあったことを知りたければO_o – Quirexx

+0

最後にEndDocumentイベントをスキップしなければならないので、FilteredEventReaderを作成しました。それ以外の場合は、完全なxmlを終了します。 – Quirexx

+0

この例を使用すると、この例外が発生します。javax.xml.stream.XMLStreamException:開いている開始要素がありません。終了要素を書き込もうとしています –

関連する問題