Engineering school, 3rd year
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

158 lines
4.3 KiB

// DomParserDemo.java
// Modifie un arbre DOM
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.FactoryConfigurationError;
import javax.xml.parsers.ParserConfigurationException;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
import java.io.File;
import java.io.IOException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.w3c.dom.DOMException;
import org.w3c.dom.NamedNodeMap;
import java.util.*;
public class DOMParserDemo {
public void performDemo(String uri) {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
try {
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse(new File(uri));
doc = transform(doc);
printNode(doc);
} catch (Throwable t) {
t.printStackTrace ();
System.exit (1);
}
System.exit (0);
}
public Document transform(Document doc) {
Element root = doc.getDocumentElement();
NodeList rnl = root.getChildNodes();
//
Node ge = null;
Node me = null;
Node de = null;
int s = rnl.getLength();
for (int i = 0; i < s; i++) {
Node n = rnl.item(i);
if (n instanceof Element) {
String name = n.getNodeName();
if ("groupes".equals(name)) {
ge = n;
} else if ("musiciens".equals(name)) {
me = n;
} else if ("disques".equals(name)) {
de = n;
}
}
}
Map<String, Node> groups = new HashMap<String, Node>();
Map<String, Node> groups2 = new HashMap<String, Node>();
NodeList groupList = ge.getChildNodes();
s = groupList.getLength();
for (int i = 0; i < s; i++) {
Node element = groupList.item(i);
if (element instanceof Element) {
NamedNodeMap att = element.getAttributes();
Node tmp = me.cloneNode(false);
element.appendChild(tmp);
groups.put(att.getNamedItem("id").getNodeValue(), tmp);
tmp = de.cloneNode(false);
element.appendChild(tmp);
groups2.put(att.getNamedItem("id").getNodeValue(), tmp);
}
}
NodeList musicienList = me.getChildNodes();
s = musicienList.getLength();
for (int i = 0; i < s; i++) {
Node element = musicienList.item(i);
if (element instanceof Element) {
NamedNodeMap att = element.getAttributes();
String attVal = att.getNamedItem("groupe").getNodeValue();
((Node) groups.get(attVal)).appendChild(element);
}
}
NodeList disqueList = de.getChildNodes();
s = disqueList.getLength();
for (int i = 0; i < s; i++) {
Node element = disqueList.item(i);
if (element instanceof Element) {
NamedNodeMap att = element.getAttributes();
String attVal = att.getNamedItem("groupe").getNodeValue();
((Node) groups2.get(attVal)).appendChild(element);
}
}
root.removeChild(de);
root.removeChild(me);
return doc;
}
public void p(Object o) {
System.out.println(o);
}
public void printNode(Node node) {
switch (node.getNodeType()) {
case Node.DOCUMENT_NODE:
Document doc = (Document) node;
System.out.println("<?xml version=\"1.0\"?>");
printNode(doc.getDocumentElement());
break;
case Node.ELEMENT_NODE:
System.out.print("<"+node.getNodeName());
NamedNodeMap attributs = node.getAttributes();
for (int i=0; i<attributs.getLength(); i++) {
System.out.print(" " +
attributs.item(i).getNodeName() + "=\"" +
attributs.item(i).getNodeValue() + "\"");
}
System.out.print(">");
NodeList children = node.getChildNodes();
if (children != null) {
for (int i=0; i<children.getLength(); i++) {
printNode(children.item(i));
}
}
System.out.print("</"+node.getNodeName()+">");
break;
case Node.TEXT_NODE:
System.out.print(node.getNodeValue());
break;
}
}
public static void main(String[] argv) {
if (argv.length != 1) {
System.err.println ("Usage: cmd filename > sortie");
System.exit (1);
}
String uri = argv[0];
//System.out.println("En train de traiter fichier "+uri);
DOMParserDemo parserDemo = new DOMParserDemo();
parserDemo.performDemo(uri);
}
}