2010-06-24 3 views
2

Disons que nous avons un org.w3c.dom.Document représentant le code XML suivant:Comment créer un nouveau document à partir d'un sous-ensemble d'un autre document?

<Fruits> 
    <Apples> 
    <Red/> 
    <Green/> 
    </Apples> 
</Fruits> 

Si nous savons que le document contiendra toujours une racine <Fruits> avec un seul enfant (dans ce cas <Apples>, mais la le nom de l'enfant est généralement inconnu), comment pouvons-nous faire de cet enfant la racine d'un nouveau org.w3c.dom.Document? En d'autres termes, ce nouveau document devrait représenter le code XML suivant:

<Apples> 
    <Red/> 
    <Green/> 
</Apples> 

Mon problème est que lorsque je tente d'extraire l'enfant, je ne peux pas faire oublier son parent (il se souvient encore de sa position dans l'original document).

Répondre

2

Quelque chose comme ceci:

Node apples = doc.getFirstChild().getFirstChild(); 
      //or whatever is your way to find the node to copy 
    Document newDocument = builder.newDocument(); 
    Node applesCopy = newDocument.importNode(apples, true); 
    newDocument.appendChild(applesCopy); 

Fondamentalement, vous obtenez un nœud de l'ancien document, l'importer dans le nouveau document et l'ajouter à la partie supérieure.

+0

Merci! J'ai d'abord eu quelques problèmes avec getFirstChild() retournant un nœud d'espace, mais après avoir enlevé les espaces du XML il fonctionne maintenant bien. – hakos

+0

@hakos, probablement préférable de faire un getElementsByTagName ("Pommes"). Item (0); De cette façon, vous n'avez pas besoin de vous inquiéter des espaces. –

1

Une alternative viable pour l'exemple que vous donnez est de travailler sur des chaînes non analysées et d'utiliser une regex pour extraire la partie que vous voulez.

Cela ne s'adapte pas bien à un traitement plus complexe. Mais c'est probablement la solution la plus simple et la plus efficace pour les cas simples.

Questions connexes