2013-05-01 7 views
-1

У меня есть xml-файл, и я ищу, чтобы переопределить дочерние элементы на основе определенных атрибутов (значение, если «id» в примере ниже). Я ищу, чтобы переписать файл xml так, чтобы «bk103» был первым дочерним. Мой вопрос не в том, как сортировать дочерние элементы (это можно сделать с условием «если»). Мне было интересно, есть ли способ проанализировать XML-файл и переписать элементы обратно в xml-файл в том порядке, в котором я бы хотел, чтобы он находился (например, по возрастанию порядка id книги)Как упорядочить дочерние элементы в XML-файле с помощью Java

Какие методы следует использовать для сделайте это, также если кто-нибудь может предложить алгоритм сделать то же самое.

<?xml version="1.0"?> 
<catalog> 
    <book id="bk101"> 
     <author>Gambardella, Matthew</author> 
     <title>XML Developer's Guide</title>enter code here 
     <genre>Computer</genre> 
     <price>44.95</price> 
     <publish_date>2000-10-01</publish_date> 
     <description>An in-depth look at creating applications 
     with XML.</description> 
    </book> 
    <book id="bk102"> 
     <author>Ralls, Kim</author> 
     <title>Midnight Rain</title> 
     <genre>Fantasy</genre> 
     <price>5.95</price> 
     <publish_date>2000-12-16</publish_date> 
     <description>A former architect battles corporate zombies, 
     an evil sorceress, and her own childhood to become queen 
     of the world.</description> 
    </book> 
    <book id="bk103"> 
     <author>Corets, Eva</author> 
     <title>Maeve Ascendant</title> 
     <genre>Fantasy</genre> 
     <price>5.95</price> 
     <publish_date>2000-11-17</publish_date> 
     <description>After the collapse of a nanotechnology 
     society in England, the young survivors lay the 
     foundation for a new society.</description> 
    </book> 
</catalog> 


Output: 

<?xml version="1.0"?> 
<catalog> 
    <book id="bk103"> 
     <author>Corets, Eva</author> 
     <title>Maeve Ascendant</title> 
     <genre>Fantasy</genre> 
     <price>5.95</price> 
     <publish_date>2000-11-17</publish_date> 
     <description>After the collapse of a nanotechnology 
     society in England, the young survivors lay the 
     foundation for a new society.</description> 
    </book> 
<book id="bk102"> 
     <author>Ralls, Kim</author> 
     <title>Midnight Rain</title> 
     <genre>Fantasy</genre> 
     <price>5.95</price> 
     <publish_date>2000-12-16</publish_date> 
     <description>A former architect battles corporate zombies, 
     an evil sorceress, and her own childhood to become queen 
     of the world.</description> 
    </book> 
    <book id="bk101"> 
     <author>Gambardella, Matthew</author> 
     <title>XML Developer's Guide</title> 
     <genre>Computer</genre> 
     <price>44.95</price> 
     <publish_date>2000-10-01</publish_date> 
     <description>An in-depth look at creating applications 
     with XML.</description> 
    </book> 


</catalog> 
+0

ваш текущий вопрос является слишком широким. разбить его на более мелкие кусочки и работать над ними индивидуально. – jtahlborn

+0

Я только что отредактировал сообщение, чтобы быть немного более конкретным. дайте мне знать, если достаточно ясно – user2339561

+0

Возможный дубликат [Сортировка XML в Java] (http://stackoverflow.com/questions/2917133/sorting-an-xml-in-java) – fglez

ответ

0

Вам нужен хороший XML-парсер для java. Затем вы можете использовать это, чтобы создать новый XML-документ по вашему выбору. На самом деле MKYong уже покрыл и Reading from an xml document, и creating an xml document в java. Он также охватывает извлечение значений внутри атрибутов элементов.

+0

Я использую парсеры DOM. Есть ли метод в java, который я мог бы использовать для сортировки элементов в документе? – user2339561

0

В следующем примере читается исходный файл «xmlFile.xml», в алфавитном порядке отменяющий порядок узлов книги и записывающий результат в новый файл «newXmlFile.xml».

package org.example; 

import java.io.File; 
import java.io.FileWriter; 
import java.io.IOException; 
import java.util.ArrayList; 
import java.util.Collections; 
import java.util.Comparator; 
import java.util.List; 

import org.jdom2.Document; 
import org.jdom2.Element; 
import org.jdom2.JDOMException; 
import org.jdom2.input.SAXBuilder; 
import org.jdom2.output.Format; 
import org.jdom2.output.XMLOutputter; 

public class XmlElementOrder { 

    private static final String ID = "id"; 
    private static final String PATH_PREFIX = "src/main/resources/"; 
    private static final String SOURCE_FILE = "xmlFile.xml"; 
    private static final String TARGET_FILE = "newXmlFile.xml"; 

    public static void main(String[] args) throws JDOMException, IOException { 

     File xmlFile = new File(PATH_PREFIX + SOURCE_FILE); 
     SAXBuilder builder = new SAXBuilder(); 
     Document document = builder.build(xmlFile); 

     Element rootElement = document.detachRootElement(); 
     List<Element> children = new ArrayList<Element>(rootElement.getChildren()); 
     rootElement.removeContent(); 

     Comparator<Element> comparator = new Comparator<Element>() { 
      public int compare(Element o1, Element o2) { 
       return o2.getAttributeValue(ID).compareTo(o1.getAttributeValue(ID)); 
      } 
     }; 
     Collections.sort(children, comparator); 

     Document newDocument = new Document(rootElement); 
     rootElement.addContent(children); 

     XMLOutputter xmlOutput = new XMLOutputter(); 
     xmlOutput.setFormat(Format.getPrettyFormat()); 
     xmlOutput.output(newDocument, new FileWriter(PATH_PREFIX + TARGET_FILE)); 

    } 
} 

В примере используется JDOM библиотеку. Если вы используете Maven вы можете включить его в свой POM следующим образом:

<dependency> 
    <groupId>org.jdom</groupId> 
    <artifactId>jdom</artifactId> 
    <version>2.0.2</version> 
</dependency> 
+0

Я получаю Null указатель при возврате o2.getAttributeValue (ID) .compareTo (o1.getAttributeValue (ID)); , Как это исправить? –

1

Вы можете использовать XQuery, чтобы изменить ваши <book/> узлы в вашем XML.

declare variable $input-document external; 

<catalog> 
{ 
    for $book in doc($input-document)/catalog/book 
    let $id := $book/data(@id) 
    order by $id descending 
    return $book 
} 
</catalog> 

с XQuery двигатель как Saxon вы преобразовать XML из командной строки:

java -cp saxon9he.jar net.sf.saxon.Query input-document=input.xml reorder.xq 

saxon9he.jar является Saxon HE JAR, то XQuery переменная $input-document связана с 'input.xml' вызова XQuery в файле reorder.xq ,

Если вам действительно нужно позвонить в XQuery с Java, вы можете сделать это с помощью XQJ.

import java.io.FileInputStream; 
import java.io.IOException; 
import java.io.InputStream; 

import javax.xml.namespace.QName; 
import javax.xml.xquery.XQConnection; 
import javax.xml.xquery.XQDataSource; 
import javax.xml.xquery.XQException; 
import javax.xml.xquery.XQPreparedExpression; 
import javax.xml.xquery.XQSequence; 

import net.sf.saxon.xqj.SaxonXQDataSource; 


public class ReorderXml { 

    public static void main(String[] args) throws XQException, IOException { 

    // Use XQJ to execute an XQuery with Saxon HE 
    XQDataSource ds = new SaxonXQDataSource(); 
    XQConnection conn = ds.getConnection(); 

    // InputStream for the XQuery 
    InputStream query = new FileInputStream("reorder.xq"); 

    // Create a prepared expression ... 
    XQPreparedExpression exp = conn.prepareExpression(query); 

    // ... and bind the path to the input document to XQuery variable $input-document 
    exp.bindString(new QName("input-document"), "data/input.xml", null); 

    // Execute the query and ... 
    XQSequence xqs = exp.executeQuery(); 

    // ... print the resulting document to standard out. 
    xqs.writeSequence(System.out, null); 

    // Clean up (production code should do that in a finally clause!) 
    xqs.close(); 
    conn.close(); 
    query.close(); 
    } 

} 

Есть также некоторые другие двигатели XQuery как Zorba и MXQuery.

0

Просто измените компаратор с этим:

 Comparator<Element> comparator = (op1,op2) -> op2.getChildText(ID).compareTo(op1.getChildText(ID));  

Simone

Смежные вопросы