2016-12-09 11 views
0

JAXBのアンマーシャリングの例を使用してテキストを取得しようとしていますが、within ...タグを取得できません。これは私のコードをインデントの私の最初の質問、したがって、非常に不確かであるが、ここでは行く: LangFlag.javaJAXBを使用して要素から完全なテキストを取得することができません

package IDJAXBParser; 

    import java.util.List; 

    import javax.xml.bind.annotation.XmlAnyElement; 
    import javax.xml.bind.annotation.XmlAttribute; 
    import javax.xml.bind.annotation.XmlElement; 
    import javax.xml.bind.annotation.XmlRootElement; 
    import javax.xml.bind.annotation.XmlType; 



    @XmlType(propOrder = { "name", "description", "match", "context" }) 
    @XmlRootElement(name = "langFlag") 

    public class LangFlag 
    { 

     String name; 

     public String getName() 
     { 
      return name; 
     } 

     @XmlAttribute(name = "name") 
     public void setName(String name) 
     { 
      this.name = name; 
     } 

     String description; 

     public String getDescription() 
     { 
      return description; 
     } 

     @XmlElement(name = "description") 
     public void setDescription(String description) 
     { 
      this.description = description; 
     } 

     String context; 

     @XmlAnyElement(BioHandler.class) 
     public String getContext() 
     { 
      return context; 
     } 


     public void setContext(String context) 
     { 
      this.context = context; 
     } 
     List<String> match; 

     public List<String> getMatch() 
     { 
      return match; 
     } 

     @XmlElement(name = "match") 
     public void setMatch(List<String> match) 
     { 
      this.match = match; 
     } 

     @Override 
     public String toString() 
     { 
      StringBuffer str = new StringBuffer("Name: " + getName() + "\n"); 
      str.append("Description:" + getDescription() + "\n"); 
      str.append("Context:" + getContext() + "\n"); 
      str.append("Match:" + getMatch() + "\n"); 
      str.append("\n"); 
      return str.toString(); 
     } 
    } 

ListOfLangFlags.java

package IDJAXBParser; 

    import java.util.ArrayList; 
    import java.util.List; 

    import javax.xml.bind.annotation.XmlElement; 
    import javax.xml.bind.annotation.XmlRootElement; 

    @XmlRootElement(name = "listOfLangFlags") 
    public class ListOfLangFlags 
    { 
     List<LangFlag> listOfLangFlags; 

     public List<LangFlag> getLangFlags() 
     { 
      return listOfLangFlags; 
     } 

     /** 
     * element that is going to be marshaled in the xml 
     */ 
     @XmlElement(name = "langFlag") 
     public void setLangFlags(List<LangFlag> listOfLangFlags) 
     { 
      this.listOfLangFlags = listOfLangFlags; 
     } 

     public void add(LangFlag langFlag) 
     { 
      if(this.listOfLangFlags == null) 
      { 
       this.listOfLangFlags = new ArrayList<LangFlag>(); 
      } 
      this.listOfLangFlags.add(langFlag); 

     } 

     @Override 
     public String toString() 
     { 
      StringBuffer str = new StringBuffer(); 
      for(LangFlag langFlag : this.listOfLangFlags) 
      { 
       str.append(langFlag.toString()); 
      } 
      return str.toString(); 
     } 

    } 

UnMarshalJAXVBComplete.java パッケージIDJAXBParser。

import java.io.File; 

    import javax.xml.bind.JAXBContext; 
    import javax.xml.bind.JAXBException; 
    import javax.xml.bind.Unmarshaller; 

    import IDJAXBParser.ListOfLangFlags; 

    public class UnMarshalJAXVBComplete 
    { 
     public static void main(String[] args) 
     { 

      try 
      { 

       File file = new File("testv1.xml"); 
       JAXBContext jaxbContext = JAXBContext.newInstance(ListOfLangFlags.class); 

       Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller(); 
       ListOfLangFlags langFlags = (ListOfLangFlags)jaxbUnmarshaller.unmarshal(file); 
       System.out.println(langFlags); 

      } 
      catch(JAXBException e) 
      { 
       e.printStackTrace(); 
      } 

     } 

    } 

これは私のXMLドキュメントです:

<listOfLangFlags> 
<langFlag name="Lang Flag Name"> 
           <description>Lang Flag Description</description> 
           <context begin="0" end="100">I am so <span class="locality">blue </span> 
           I'm greener than purple. </context> 
           <suggestions/> 
           <match>I am so</match> 
           <match>blue</match> 
          </langFlag> 
     </listOfLangFlags> 

BioHandler.java

package IDJAXBParser; 

import java.io.StringReader; 
import java.io.StringWriter; 

import javax.xml.bind.ValidationEventHandler; 
import javax.xml.bind.annotation.DomHandler; 
import javax.xml.transform.Source; 
import javax.xml.transform.stream.StreamResult; 
import javax.xml.transform.stream.StreamSource; 

public class BioHandler implements DomHandler<String, StreamResult> { 

    private static final String BIO_START_TAG = "<context>"; 
    private static final String BIO_END_TAG = "</context>"; 

    private StringWriter xmlWriter = new StringWriter(); 

    public StreamResult createUnmarshaller(ValidationEventHandler errorHandler) { 
     xmlWriter.getBuffer().setLength(0); 
     return new StreamResult(xmlWriter); 
    } 

    public String getElement(StreamResult rt) { 
     String xml = rt.getWriter().toString(); 
     int beginIndex = xml.indexOf(BIO_START_TAG) + BIO_START_TAG.length(); 
     int endIndex = xml.indexOf(BIO_END_TAG); 
     return xml.substring(beginIndex, endIndex); 
    } 

    public Source marshal(String n, ValidationEventHandler errorHandler) { 
     try { 
      String xml = BIO_START_TAG + n.trim() + BIO_END_TAG; 
      StringReader xmlReader = new StringReader(xml); 
      return new StreamSource(xmlReader); 
     } catch(Exception e) { 
      throw new RuntimeException(e); 
     } 
    } 

} 

任意の助けをいただければ幸いです!事前に感謝

+0

これは私のコードの結果である: 名:ラングフラグ名 説明:ラングフラグ説明 コンテキスト: \t \t \t \t \t \tは、私が紫より環境に優しいです。 マッチ:[私はそう、青] – javaNoob2792

+0

あなたの期待どおりの結果は?ところで、 '@ XmlAnyElement(BioHandler.class)'を指定するので、 'BioHandler.java'のソースコードも投稿してください。 –

+0

@ベクヤン、予想される結果は、コンテキストフィールドからテキスト全体を取り戻すことです。つまり、私はとても青く、私は紫よりも緑です。 – javaNoob2792

答えて

0

DOM objectStringの間で変換するDomHandlerの実装があります。

import java.io.StringReader; 

import javax.xml.bind.ValidationEventHandler; 
import javax.xml.bind.annotation.DomHandler; 
import javax.xml.transform.Source; 
import javax.xml.transform.dom.DOMResult; 
import javax.xml.transform.stream.StreamSource; 
import javax.xml.xpath.XPathConstants; 
import javax.xml.xpath.XPathExpressionException; 
import javax.xml.xpath.XPathFactory; 

import org.w3c.dom.Document; 
import org.w3c.dom.DocumentFragment; 
import org.w3c.dom.Element; 
import org.w3c.dom.Node; 
import org.w3c.dom.NodeList; 

public class BioHandler implements DomHandler<String, DOMResult> { 

    private StringBuilder buffer = new StringBuilder(); 

    public DOMResult createUnmarshaller(ValidationEventHandler errorHandler) { 
     return new DOMResult(); 
    } 

    public String getElement(DOMResult rt) { 
     Node n = rt.getNode(); 
     Element ele = null; 
     if (n instanceof Document) { 
      ele = ((Document)n).getDocumentElement(); 
     } else if (n instanceof DocumentFragment) { 
      ele = (Element)n.getChildNodes().item(0); 
     } 
     //StringBuilder sb = new StringBuilder(); //only capture the text under current node. 
     if (ele != null && "context".equals(ele.getLocalName())) { 
      try { 
       NodeList nl = (NodeList)XPathFactory.newInstance().newXPath() 
         .compile("descendant::text()").evaluate(ele, XPathConstants.NODESET); 
       int length = nl.getLength(); 
       for (int i = 0; i < length; i++) { 
        buffer.append(nl.item(i).getTextContent()); 
       } 
      } catch (XPathExpressionException e) { 
       throw new RuntimeException(e); 
      } 
     } 
//for problem tracing 
//System.err.println("BioHandler.getElement(), ele="+ele.getLocalName() +", result=["+result+"]"); 
     return buffer.toString(); 
    } 

    public Source marshal(String n, ValidationEventHandler errorHandler) { 
     try { 
      String xml = "<context>" + n.trim() + "</context>"; 
      StringReader xmlReader = new StringReader(xml); 
      return new StreamSource(xmlReader); 
     } catch(Exception e) { 
      throw new RuntimeException(e); 
     } 
    } 
} 

私のテストでは、不明の<suggestions/> elementは同じオブジェクトによって処理されます。だから、bufferをクラス変数と宣言し、キャプチャされたコンテンツを毎回出力します。

+0

xml内の単一のノードで正常に動作しますが、別のノードを追加すると、コンテキスト・テキストが次のコンテキストに追加されます。バッファをリセットするには?ありがとう – javaNoob2792

+0

解決策は、変数 'buffer'を' getElement(DOMResult rt) 'メソッドに移動しています。 'ele'がnullのときの戻り値についても考慮する必要があります。 –

+0

変数バッファをgetElement(DOMResult rt)メソッドに移動しようとしました。しかし、これはすべての "テキスト"コンテキスト要素をクリアしました。 – javaNoob2792

関連する問題