2017-09-30 4 views
0

Je n'ai pas le fichier xsd d'un document XML, donc je dois changer par défaut xmlns "http://www.w3.org/2001/XMLSchema-instance" pour pars les éléments XML, mais il y a un problème à faites-le, quand je change l'attribut xmlns de l'élément racine (myroot) un autre attribut (xmlns) est créé dans l'élément enfant (data) avec la valeur "myxsd.xsd". Je veux ignorer ou modifier la valeur de xmlns (myxsd.xsd) pour analyser correctement le document.JDOM2, xmlns (xsd) c'ant modifier ou supprimer du document XML

Mon XML Entrée:

<?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> 

Ma sortie 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> 

Mon code:

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); 

} 

Répondre

1

Je ne comprends pas vraiment pourquoi vous voulez déplacer les éléments en un espace de noms différent (en particulier dans l'espace de noms http://www.w3.org/2001/XMLSchema-instance, qui n'est pas prévu à cet effet), b Si vous voulez le faire, vous devez changer tous les éléments, pas seulement le plus externe. Bien que la déclaration d'espace de nom ne soit présente que sur l'élément le plus externe, elle a pour effet de placer tous les éléments dans cet espace de noms et ils resteront dans cet espace de noms sauf si vous les modifiez.

+0

Je veux supprimer l'attribut xmlns du fichier XML d'entrée, mais je ne sais pas comment le faire. –

+1

Ensuite, la première chose que vous devez comprendre est l'effet des attributs xmlns dans le XML source sur les noms et autres propriétés des nœuds dans la représentation JDOM du XML analysé. Désolé si j'ai échoué à expliquer cela. Je vais réessayer: un attribut xmlns sur l'élément le plus externe change l'URI d'espace de nom de chaque élément de l'arbre, et pour se débarrasser de l'espace de noms, vous devez changer le nom de chaque élément. –