2013-11-04 2 views
3

I로 비누 봉투 다음과 같은 XML을 가지고 자바 String :JDOM을 사용하여 비누 봉투를 제거하고 나머지 XML을 문자열로 반환하려면 어떻게해야합니까?

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> 
    <soap:Body> 
    <MyStartElement xmlns="http://www.example.com/service"> 
     ... 

내가 hamcrest 나중에 그것에 XML-정합 기 확장 https://code.google.com/p/xml-matchers를 사용할 수 있도록하려면,하지만 처음에는 없애 싶어 비누 봉투.

JDOM 2.0.5를 사용하여 비누 봉투를 제거하고 String으로 남아있는 XML (예 : MyStartElement 루트로 시작)을 다시 가져올 수 있습니까?

SAXBuilder builder = new SAXBuilder(); 
Document document = (Document) builder.build(toInputStream(THE_XML)); 
Namespace ns = Namespace 
      .getNamespace("soap", "http://schemas.xmlsoap.org/soap/envelope/"); 
Namespace ns2 = Namespace 
      .getNamespace("http://www.example.com/service"); 
Element response = document.getRootElement() 
      .getChild("Body", ns) 
      .getChild("MyStartElement", ns2); 
System.out.println(new XMLOutputter().outputString(new Document(response))); 

이 반환 : 스레드 "주요"org.jdom2.IllegalAddException에서 예외 : 콘텐츠가 이미 기존의 부모가 "비누 : 바디"

I

나는 다음과 같은 시도 유사한 설정이있어서 어디서 전화했는지

System.out.println(new XMLOutputter().outputString(new Document(response))); 

하지만 SOAP 봉투를 포함한 전체 XML을 반환했습니다.

JDOM을 사용하여 XML에서 비누 봉투를 벗겨 내고 String을 다시 얻으려면 어떻게해야합니까?

보너스 질문 :

  • 는 JDOM이 좋은 소개/튜토리얼이 있습니까? (웹 사이트에는 JavaDocs 만있는 것 같습니다. 시작하기가 약간 어려워집니다 ...)
  • JDOM을 사용하는 것이이 코드의 맨 위에있는 것 같습니다. 더 쉬운 방법으로 이것을하는 방법에 대한 제안?

답변

2

JDOM 콘텐츠는 한 번에 하나의 부모 (요소/문서)에만 첨부 할 수 있습니다. 응답은 이미 비누 네임 스페이스의 부모 요소 '본문'에 연결되어 있습니다. maintainder로

response.detach(); 
System.out.println(new XMLOutputter().outputString(new Document(response))); 

:

당신에게 하나가 그것의 부모로부터 응답을 분리 할 필요가, 또는 당신이 그것을 복제하고 새로운 인스턴스를 생성 할 필요가 .....이 경우, detach()은 당신의 친구입니다 JDOM 프로젝트 중 당신이 그것을 사용하도록 권장하는 것은 자연스럽게 나옵니다. 따라서 적절한 수준의 편견을 가지고 사용하십시오.

JDOM에 대한 소개/튜토리얼에 대한 설명은 환상적이지는 않지만 the FAQ is usefulgithub wiki here에 'primer'를 설정했습니다. 질문이 있으시면 jdom-interest 메일 링리스트가 활성화되어 있으며 여기에서 jdomjdom-2 태그를 stackoverflow에서 정기적으로 모니터링합니다.

관련 문제