Введение в DOM

       

Подготовка данных


Мы в нашем учебнике рассмотрели, как выбирать, работать и манипулировать с XML-данными. Для завершения цикла вы должны также уметь выводить XML.

В случае этого учебника целевым выводом является файл, в котором просто перечисляются все заказы по мере того, как они поступают или отвергаются на основе кредита покупателя и customerid.

<?xml version="1.0" encoding="UTF-8"?> <processedOrders> <order> <status>PROCESSED</status> <customerid>2341</customerid> <amount>874.00</amount> </order> <order> <status>REJECTED</status> <customerid>251222</customerid> <amount>200.00</amount> </order> </processedOrders>

Сначала приложение создает объект Document для вывода. Для удобства тот же самый DocumentBuilder, который создавал исходный Document, может создавать и новый.

... public static void main (String args[]) { File docFile = new File("orders.xml"); Document doc = null; Document newdoc = null;

try { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); doc = db.parse(docFile); newdoc = db.newDocument();

} catch (Exception e) { System.out.print("Problem parsing the file: "+e.getMessage()); } ... thisOrder.insertBefore(totalElement, thisOrder.getFirstChild()); } Element newRoot = newdoc.createElement("processedOrders"); NodeList processOrders = doc.getElementsByTagName("order"); for (int orderNum = 0; orderNum < processOrders.getLength(); orderNum++) { Element thisOrder = (Element)processOrders.item(orderNum); Element customerid = (Element)thisOrder.getElementsByTagName("customerid") .item(0); String limit = customerid.getAttributeNode("limit").getNodeValue(); String total = thisOrder.getElementsByTagName("total").item(0) .getFirstChild().getNodeValue(); double limitDbl = new Double(limit).doubleValue(); double totalDbl = new Double(total).doubleValue(); Element newOrder = newdoc.createElement("order"); Element newStatus = newdoc.createElement("status"); if (totalDbl > limitDbl) { newStatus.appendChild(newdoc.createTextNode("REJECTED")); } else { newStatus.appendChild(newdoc.createTextNode("PROCESSED")); } Element newCustomer = newdoc.createElement("customerid"); String oldCustomer = customerid.getFirstChild().getNodeValue(); newCustomer.appendChild(newdoc.createTextNode(oldCustomer)); Element newTotal = newdoc.createElement("total"); newTotal.appendChild(newdoc.createTextNode(total)); newOrder.appendChild(newStatus); newOrder.appendChild(newCustomer); newOrder.appendChild(newTotal); newRoot.appendChild(newOrder); } newdoc.appendChild(newRoot); System.out.print(newRoot.toString());


...

После обработки orders. xml приложение создает новый элемент, processedOrders, который в конечном счете станет корневым элементом нового документа. Затем оно проходит через каждый заказ. Для каждого заказа оно выделяет информацию total и limit.

Далее приложение создает новые элементы для заказа: order, status, customerid и amount. Оно заполняет status на основе того, превышает ли итог кредит покупателя, и в соответствии с этим заполняет остальное.

После того, как приложение создало элементы, оно должно собрать их вместе. Сначала оно добавляет состояние, информацию о покупателе и итог в новый элемент order. Затем оно добавляет новый order в элемент newRoot.

Пока все это происходит, элемент newRoot на самом деле не присоединен к родительскому узлу. Когда приложение завершит обработку всех заказов, newRoot присоединяется к новому документу.

Наконец, приложение выводит данные, преобразовывая newRoot в String и просто посылая его в System.out.






Содержание раздела