0

Java 객체를 직렬화하기 위해 잠시 동안 SimpleXML을 사용했지만 아직 학습 중이며 때로는 문제가 발생합니다.SimpleXML을 사용하여 다른 xml 마크 업을 단일 문자열로 포함하는 XML 요소를 비 직렬화

<messages> 
<message> 
    <text> 
     A communications error has occurred. Please try again, or contact <a href="someURL">administrator</a>. Alternatively, please <a href = "someURL' />">register</a>. 
    </text>  
</message> 

내가 요소의 내용을 하나의 문자열과 앵커 태그로 취급이되도록 과정을 싶습니다 무시하는 : 나는 직렬화하는 하는 다음과 같은 XML이있다. 나는이 XML이 어떻게 생성되는지에 대해서는 아무런 통제권이 없다. 당신이 볼 수 있듯이, 어떤 서버로부터의 에러 메시지이다. 이것을 어떻게 성취합니까? 미리 감사드립니다.

import static org.apache.commons.lang.StringEscapeUtils.escapeHtml; 

을 그리고로 사용 :

답변

0

텍스트를 읽는 방법과 요소는 간단한 XML에서 기본적으로 제공되지 않습니다. 변환기를 사용해야합니다. 하나의 텍스트 만 읽는 것을 제외하고는 똑같은 문제에 대답하는 https://stackoverflow.com/questions/17462970/simpleframwork-xml-element-with-inner-text-and-child-elements을 읽을 수 있습니다.

다음은 단일 문자열에서 배수 텍스트 및 href를 얻는 방법입니다.

@Root(name = "a") 
public class A { 
    @Attribute(required = false) 
    private String href; 
    @Text 
    private String value; 

    @Override 
    public String toString(){ 
     return "<a href = \"" + href + "\">" + value + "</a>"; 
    } 
} 

그런 다음 텍스트 클래스는 '텍스트'를 읽고, : 그것은 XML에서와 같이 먼저

, 나는 태그를 인쇄 할의 toString 메도과 함께 'A'태그에 대한 클래스를 생성 변환이 필요 여기서 I는 표준 시리얼 라이저와 'A'태그를 읽고, XML 문자열로 다시 얻을 수있는 클래스에서의 toString 메도를 추가

@Root(name = "Text") 
@Convert(Text.Parsing.class) 
public class Text { 

    @Element 
    public String value; 

    private static class Parsing implements Converter<Text> { 
     // to read <a href...> 
     private final Serializer ser = new Persister(); 

     @Override 
     public Text read(InputNode node) throws Exception { 
      Text t = new Text(); 
      String s; 
      InputNode aref; 

      // read the begining of text (until first xml tag) 
      s = node.getValue(); 
      if (s != null) { t.value = s; } 
      // read first tag (return null if no more tag in the Text) 
      aref = node.getNext(); 
      while (aref != null) { 
       // add to the value using toString() of A class 
       t.value = t.value + ser.read(A.class, aref); 
       // read the next part of text (after the xml tag, until the next tag) 
       s = node.getValue(); 
       // add to the value 
       if (s != null) { t.value = t.value + s; } 
       // read the next tag and loop 
       aref = node.getNext(); 
      } 
      return t; 
     } 

     @Override 
     public void write(OutputNode node, Text value) throws Exception { 
      throw new UnsupportedOperationException("Not supported yet."); 
     } 
    } 
} 

참고. 'a'태그를 텍스트로 직접 읽는 방법을 찾지 못했습니다.

그리고 주요 클래스 (텍스트 요소의 deserialisation로 변환 방법을 매핑 AnnotationStrategy 잊지 마세요) :

<text> 
    A communications error has occurred. Please try again, or contact <a href="someURL">administrator</a>. 
    Alternatively, please <a href = "someURL' />">register</a>. 
</text> 
: 나는 다음과 같은 XML 파일과 함께 사용하면

public class parseText { 
    public static void main(String[] args) throws Exception { 
    Serializer serializer = new Persister(new AnnotationStrategy()); 
    InputStream in = ClassLoader.getSystemResourceAsStream("file.xml"); 
    Text t = serializer.read(Text.class, in, false); 

    System.out.println("Texte : " + t.value); 
    } 
} 

을 나는이 당신을 도움이되기를 바랍니다

Texte : 
    A communications error has occurred. Please try again, or contact <a href = "someURL">administrator</a>. 
    Alternatively, please <a href = "someURL' />">register</a>. 

:

그것은 다음과 같은 결과를 제공 당신의 문제를 해결하십시오.