2013-08-29 3 views
2

큰 XML을 가지고 있으며 중복 노드 제거와 같은 XML의 특정 노드를 업데이트하고 싶습니다.XMLStreamWriter를 사용하여 XML을 업데이트하십시오.

XML이 너무 커서 STAX API 클래스 인 XMLStreamReader를 사용하는 것이 좋습니다. 먼저 XMLStreamReader를 사용하여 XML을 읽습니다. 나는 읽은 데이터를 사용자 객체에 저장하고 이러한 사용자 객체를 조작하여 중복을 제거했습니다.

이제이 업데이트 된 사용자 개체를 원래 XML로 되돌리고 싶습니다. 내가 생각한 것은 사용자 객체를 문자열로 정렬하여 문자열을 입력 XML의 올바른 위치에 배치 할 수 있다는 것입니다. 그러나 나는 STAX 클래스를 사용하여 그것을 성취 할 수 없다. - XMLStreamWriter

XMLStreamWriter를 사용하여이 작업을 수행 할 수 있습니까? 제발 제안 해주세요. 아니요, 제 문제에 대한 대체 방법을 제안하십시오.

우리의 주요 관심사는 여러 프로세스에서 공유되는 프로젝트 서버의 메모리에 거대한 XML을로드 할 수 없기 때문에 메모리입니다. 따라서 나는 거대한 XML을로드하기 위해 많은 메모리를 사용하기 때문에 DOM을 사용하고 싶지 않습니다.

+0

또한 사용자 객체 (bean)에서 수정해야하는 부분 만로드했습니다. 나는 메모리를 절약하기 위해 전체 XML을 콩에로드하지 않았다. – deepak

답변

2

텍스트 콘텐츠/태그 이름 등의 특정 값을 변경해야하는 경우 STAX가 도움이 될 수 있습니다. 또한 코드 아래 createFilteredReader

AuthorName-Name 이름을 변경하여 몇 가지 요소를 제거하는 데 도움이 코멘트

public class StAx { 
    public static void main(String[] args) throws FileNotFoundException, 
      XMLStreamException { 

     String filename = "HelloWorld.xml"; 

     try (InputStream in = new FileInputStream(filename); 
       OutputStream out = System.out;) { 
      XMLInputFactory factory = XMLInputFactory.newInstance(); 
      XMLOutputFactory xof = XMLOutputFactory.newInstance(); 
      XMLEventFactory ef = XMLEventFactory.newInstance(); 

      XMLEventReader reader = factory.createXMLEventReader(filename, in); 
      XMLEventWriter writer = xof.createXMLEventWriter(out); 

      while (reader.hasNext()) { 
       XMLEvent event = (XMLEvent) reader.next(); 
       if (event.isCharacters()) { 
        String data = event.asCharacters().getData(); 
        if (data.contains("Hello")) { 
         String replace = data.replace("Hello", "Oh"); 
         event = ef.createCharacters(replace); 
        } 
        writer.add(event); 
       } else if (event.isStartElement()) { 
        StartElement s = event.asStartElement(); 
        String tagName = s.getName().getLocalPart(); 
        if (tagName.equals("Name")) { 
         String newName = "Author" + tagName; 
         event = ef.createStartElement(new QName(newName), null, 
           null); 
         writer.add(event); 
         writer.add(ef.createCharacters("\n   ")); 
         event = ef.createComment("auto generated comment"); 
         writer.add(event); 
        } else { 
         writer.add(event); 
        } 
       } else { 
        writer.add(event); 
       } 
      } 
      writer.flush(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

입력

<?xml version="1.0"?> 
<BookCatalogue> 
    <Book> 
     <Title>HelloLord</Title> 
     <Name> 
      <first>New</first> 
      <last>Earth</last> 
     </Name> 
     <ISBN>12345</ISBN> 
    </Book> 
    <Book> 
     <Title>HelloWord</Title> 
     <Name> 
      <first>New</first> 
      <last>Moon</last> 
     </Name> 
     <ISBN>12346</ISBN> 
    </Book> 
</BookCatalogue> 

출력

<?xml version="1.0"?><BookCatalogue> 
    <Book> 
     <Title>OhLord</Title> 
     <AuthorName> 
      <!--auto generated comment--> 
      <first>New</first> 
      <last>Earth</last> 
     </AuthorName> 
     <ISBN>12345</ISBN> 
    </Book> 
    <Book> 
     <Title>OhWord</Title> 
     <AuthorName> 
      <!--auto generated comment--> 
      <first>New</first> 
      <last>Moon</last> 
     </AuthorName> 
     <ISBN>12346</ISBN> 
    </Book> 
</BookCatalogue> 

을 추가하는 것입니다 당신이 할 수 상황이 정말 복잡해 지는지 확인하십시오. 수정은 몇 가지 다른 노드의 상태에 따라 하나 개의 노드를 삭제하는 두 개의 노드를 교환 같은 이것보다 훨씬 더 테드 : 평균 가격보다 더 많은 가격으로 모든 책을 삭제

이 경우

최고의 솔루션을 사용하여 결과 XML을 생산하는 것입니다 xslt transformation

관련 문제