2017-09-30 10 views
0

XML 문서의 xsd 파일을 가지고 있지 않기 때문에 xmlns "http://www.w3.org/2001/XMLSchema-instance"으로 변경해야 XML 요소를 파싱 할 수 있지만 문제가 있습니다. 그것을 할 때 루트 요소 (myroot)의 xmlns 속성을 변경하면 "myxsd.xsd"값을 가진 자식 요소 (data)에 다른 속성 (xmlns)이 만들어집니다. xmlns (myxsd.xsd)의 값을 무시하거나 변경하여 문서를 올바르게 구문 분석하려고합니다. JDOM2, xmlns (xsd)가 XML 문서에서 변경하거나 제거하지 않습니다.

내 XML 입력 :

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<myroot xmlns="myxsd.xsd" class="15"> 
    <data att1="all" att2="actual"> 
     <myobject patt1="patt1_value" patt2="patt2_value" patt3="patt3_value"> 
      <p name="p1">page1</p> 
      <p name="p2">page1</p> 
      <p name="p3">page1</p> 
      <p name="p4">page4</p> 
     </myobject> 
    </data> 
</myroot> 

내 XML 출력 :

<?xml version="1.0" encoding="UTF-8"?> 
<myroot xmlns="http://www.w3.org/2001/XMLSchema-instance" class="15"> 
    <data xmlns="myxsd.xsd" att1="all" att2="actual"> 
    <myobject patt1="patt1_value" patt2="patt2_value" patt3="patt3_value"> 
     <p name="p1">page1</p> 
     <p name="p2">page1</p> 
     <p name="p3">page1</p> 
     <p name="p4">page4</p> 
    </myobject> 
    </data> 
</myroot> 

내 코드 :

public void Edit_file() throws JDOMException, IOException { 

    InputStream in = new FileInputStream("C:\\small_test.xml"); 

    SAXBuilder builder = new SAXBuilder(); 
    Document document = builder.build(in); 

    // getting the root element 
    Element root = document.getRootElement(); 
    Namespace tempNamespace = Namespace.getNamespace("http://www.w3.org/2001/XMLSchema-instance"); 
    root.setNamespace(tempNamespace); 


    // iterating over the children 
    List<Element> data = root.getChildren("data"); 

    for (Element element : data) { 

     Attribute id = element.getAttribute("att1"); 
     id.setValue("New value"); 
    } 
    XMLOutputter xmlOutput = new XMLOutputter(); 

    xmlOutput.setFormat(Format.getPrettyFormat()); 
    xmlOutput.output(document, System.out); 

} 

답변

1

당신이로 요소를 이동하려는 이유를 정말 이해가 안 돼요 다른 네임 스페이스 (특히 이러한 용도로 사용되지 않는 네임 스페이스 http://www.w3.org/2001/XMLSchema-instance), b 당신이 그것을 원한다면, 가장 바깥 쪽 요소가 아닌 모든 요소를 ​​변경해야합니다. 네임 스페이스 선언은 가장 바깥 쪽 요소에만 있지만,이 네임 스페이스에 모든 요소를 ​​넣는 효과가 있으며 변경하지 않는 한 해당 네임 스페이스에 남아 있습니다.

+0

입력 XML 파일에서 xmlns 속성을 제거하고 싶지만 어떻게 작성했는지 모르겠습니다. –

+1

그런 다음 파싱 된 XML의 JDOM 표현에있는 노드의 이름 및 기타 속성에 대한 소스 XML의 xmlns 특성의 영향을 먼저 이해해야합니다. 미안해. 내가 설명 할 수 없다면. 다시 시도해 보겠습니다 : 가장 바깥 쪽 요소의 xmlns 속성은 트리의 모든 요소의 네임 스페이스 URI를 변경하고 네임 스페이스를 없애려면 모든 요소의 이름을 변경해야합니다. –