2014-06-13 1 views
1

XML 파일에 새 노드를 추가이 같은 구조로 나는 XML 파일을

<?xml version="1.0"?> 
<entries> 
    <entry accente="one"> 
    <list>Word</list> 
    <sense class="0" value="B"> 
     <definition> 
     <MorfDef>s. m.</MorfDef> 
     <RegDef>This <i>text</i> have i node.</RegDef> 
     <ItalMarker>Text.</ItalMarker> 
     </definition> 
    </sense> 
    </entry> 
    <entry accente="two"> 
    <list>B n-1</list> 
    <sense class="0" value="B"> 
     <definition> 
     <MorfDef>s. m.</MorfDef> 
     <RegDef>This text doesn't have i atribute.</RegDef> 
     <ItalMarker>Word.</ItalMarker> 
     </definition> 
    </sense> 
    </entry> 
</entries> 

나는 RegDef 요소의 각 단어에 대한 새로운 노드를 추가 할, 그래서 결과가 될 수있다 :

<?xml version="1.0"?> 
<entries> 
    <entry accente="one"> 
    <list>Word</list> 
    <sense class="0" value="B"> 
     <definition> 
     <MorfDef>s. m.</MorfDef> 
     <RegDef><w lemma="A1">This</w> <i><w lemma="A2">text</w></i> <w lemma="A3">have</w> <w lemma="A4">i</w> <w lemma="A5">node</w> <w lemma="A6">.</w></RegDef> 
     <ItalMarker>Text.</ItalMarker> 
     </definition> 
    </sense> 
    </entry> 
    <entry accente="two"> 
    <list>B n-1</list> 
    <sense class="0" value="B"> 
     <definition> 
     <MorfDef>s. m.</MorfDef> 
     <RegDef><w lemma="A7">This</w> <w lemma="A8">text</w> <w lemma="A8">doesn't</w> <w lemma="A10">have</w> <w lemma="A11">i</w> <w lemma="A12">atribute</w> <w lemma="A13">.</w></RegDef> 
     <ItalMarker>Word.</ItalMarker> 
     </definition> 
    </sense> 
    </entry> 
</entries> 

RegDef 노드가있는 경우 < I> 나는 < I> 노드 프론 텍스트를 읽고 승 <> 각 단어에 대한 노드를 작성하려는 노드입니다.

Element rootElement = document.getDocumentElement(); 
Element element = document.createElement("w"); 
rootElement.appendChild(element); 

을하지만 바로 루트 노드 후 추가 : 나는 다음과 같은 XPath를 사용했습니다. RegDef 태그의 각 단어마다 노드를 작성한 다음 해당 노드에 특성을 추가 할 수 있습니까? 감사합니다.

+0

파일 조각을 기반으로 솔루션을 추가했습니다. 당신이 그것을 출발점으로 사용할 수 있기를 바랍니다. – helderdarocha

답변

1

파일 <entries>루트 노드를 선택했습니다. 해당 노드에서 appendChild를 사용하면 루트 노드의 마지막 자식으로 노드가 추가됩니다. 이는 예상되는 동작입니다.

당신은 실제로 랩에 당신이 당신의 예에 포함 된 코드의 세 줄만큼 간단한 작업하지 않은 w 요소와 RegDef 노드 내부 말을합니다. . 당신이 필요 것이다 들어

:.

  1. 당신은 또한 XPath를 사용하여 그들 모두를 포함, document.getElementsByTagName("RegDef") 당신에게 NodeList을 줄 것이다 DOM에있는 많은 방법이 있습니다 (즉, 노드를 선택
  2. 들어 각 RegDef 당신은 모든 자손 텍스트 노드를 선택해야합니다. 당신의 XPath 표현식을 사용하는 경우 각 RegDef의 맥락에서 같은 .//text()당신에게 그 노드의 목록을 제공합니다. 각각은 하나 또는 그 이상의 "단어를 포함 할 수있다 "또는 심지어 빈 공간과 개행.
  3. 단어에 공백이나 구두점 또는 기타 구분 기호로 구분하여 단어를 추출 할 수 있습니다. Java에는 정규 표현식을 포함하여 여러 가지 도구가 있습니다. 당신이 무시하고자하는 노드를 각각 "단어를"격리 및 제거 때
  4. 마지막으로, 당신은 단어를 포함하는 새로운 텍스트 노드를 작성, 각각에 대해w 요소를 만들고, 추가 할 수 있습니다 텍스트 노드는 해당 요소의 하위 노드입니다. 또한 속성을 설정해야합니다.

아마도 특정 문제에 초점을 맞추기 위해 더 작은 XML 파일을 사용하고 나중에 실제 예제에 맞춰야합니다.

String xml = "<nodes>\n" 
     + " <RegDef>This <i>text</i> have i node.</RegDef>\n" 
     + " <RegDef>This text doesn't have i atribute.</RegDef>\n" 
     + "</nodes>"; 
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
DocumentBuilder builder = dbf.newDocumentBuilder(); 
Document document = builder.parse(new InputSource(new StringReader(xml))); 

NodeList regDefNodes = document.getElementsByTagName("RegDef"); 
int size = regDefNodes.getLength(); 
for(int i = 0; i < size; i++) { 
    Element regDef = (Element)regDefNodes.item(i); 
    Element newRegDef = wrapWordsInContents(regDef, document); 
    Element parent = (Element)regDef.getParentNode(); 
    parent.replaceChild(newRegDef, regDef); 
} 

지금 당신이 가이드로 위의 단계를 사용할 수 있으며, wrapWordsInContents(Element e, Document doc) 방법을 쓰기 :이 같은 뭔가를 시작할 수 있습니다.

UPDATE : 당신은 wrapWordsInContents(Element e, Document doc) 방법을 포함하는 followup question의 내용을 토큰 화에 대해 물었다. 해당 메서드를 호출하고 위의 코드를 serialize하면 다음과 같습니다.

Transformer t = TransformerFactory.newInstance().newTransformer(); 
t.transform(new DOMSource(document), new StreamResult(System.out)); 

결과가 예상 한 것과 비슷합니다. 추가 질문을 참조하십시오. Modify the text content of XML tag

관련 문제