Avatar billede andreas Nybegynder
02. januar 2007 - 00:53 Der er 5 kommentarer og
1 løsning

XML I Java - sortering

Hejsa,

I Java når man bruger XML (jeg bruger det pt. til at gemme konfigurations indstillinger), kan man så sorter de entry's som java gemmer i xml filen i alfabetisk rækkefølge.

Lige nu ser min XML fil sådan her ud:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<comment>Configuration file</comment>
<entry key="relayHost">7.0.0.1</entry>
<entry key="smtpTimeout">120000</entry>
<entry key="doEmailTldCheck">false</entry>
<entry key="doEmailMXCheck">false</entry>
<entry key="webServerPort">8080</entry>
<entry key="webServerSSLPort">443</entry>
<entry key="relayPort">25</entry>
<entry key="smtpPort">125</entry>
<entry key="webServerUseSSL">true</entry>
</properties>


Som det ses kommer hver entry key ikke i alfabetisk rækkefølge, hvilket jeg gerne vil have.

Jeg bruger: storeToXML() metoden til at gemme med.
Avatar billede arne_v Ekspert
02. januar 2007 - 03:30 #1
kode:

package january;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.StringReader;
import java.util.Properties;

import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;

public class Props2Xml {
    private final static String xsl = "<?xml version='1.0'?>\r\n" +
                                      "<xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version='1.0'>\r\n" +
                                      "<xsl:output doctype-system='http://java.sun.com/dtd/properties.dtd'/>\r\n" +
                                      "<xsl:template match='/'>\r\n" +
                                      "<properties>\r\n" +
                                      "<xsl:text>\r\n" +
                                      "</xsl:text>\r\n" +
                                      "<comment>Test</comment>\r\n" +
                                      "<xsl:text>\r\n" +
                                      "</xsl:text>\r\n" +
                                      "<xsl:for-each select='//entry'>\r\n" +
                                      "<xsl:sort select='@key'/>\r\n" +
                                      "<entry>\r\n" +
                                      "<xsl:attribute name='key'>\r\n" +
                                      "<xsl:value-of select='@key'/>\r\n" +
                                      "</xsl:attribute>\r\n" +
                                      "<xsl:value-of select='.'/>\r\n" +
                                      "</entry>\r\n" +
                                      "<xsl:text>\r\n" +
                                      "</xsl:text>\r\n" +
                                      "</xsl:for-each>\r\n" +
                                      "</properties>\r\n" +
                                      "<xsl:text>\r\n" +
                                      "</xsl:text>\r\n" +
                                      "</xsl:template>\r\n" +
                                      "</xsl:stylesheet>\r\n";
    public static void main(String[] args) throws Exception {
        Properties p = new Properties();
        p.put("bb", "2");
        p.put("ccc", "3");
        p.put("a", "1");
        p.put("eeeee", "5");
        p.put("dddd", "4");
        p.storeToXML(System.out, "Test");
        System.out.println(xsl);
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        p.storeToXML(baos, "Test");
        TransformerFactory tf = TransformerFactory.newInstance();
        Transformer t = tf.newTransformer(new StreamSource(new StringReader(xsl)));
        t.setOutputProperty(javax.xml.transform.OutputKeys.ENCODING, "UTF-8");
        t.setOutputProperty(javax.xml.transform.OutputKeys.METHOD, "xml");
        t.transform(new StreamSource(new ByteArrayInputStream(baos.toByteArray())), new StreamResult(System.out));

    }
}
Avatar billede arne_v Ekspert
02. januar 2007 - 03:31 #2
output:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<comment>Test</comment>
<entry key="a">1</entry>
<entry key="dddd">4</entry>
<entry key="bb">2</entry>
<entry key="eeeee">5</entry>
<entry key="ccc">3</entry>
</properties>
<?xml version='1.0'?>
<xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version='1.0'>
<xsl:output doctype-system='http://java.sun.com/dtd/properties.dtd'/>
<xsl:template match='/'>
<properties>
<xsl:text>
</xsl:text>
<comment>Test</comment>
<xsl:text>
</xsl:text>
<xsl:for-each select='//entry'>
<xsl:sort select='@key'/>
<entry>
<xsl:attribute name='key'>
<xsl:value-of select='@key'/>
</xsl:attribute>
<xsl:value-of select='.'/>
</entry>
<xsl:text>
</xsl:text>
</xsl:for-each>
</properties>
<xsl:text>
</xsl:text>
</xsl:template>
</xsl:stylesheet>

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<comment>Test</comment>
<entry key="a">1</entry>
<entry key="bb">2</entry>
<entry key="ccc">3</entry>
<entry key="dddd">4</entry>
<entry key="eeeee">5</entry>
</properties>
Avatar billede arne_v Ekspert
02. januar 2007 - 04:05 #3
du skal naturligvis ændre kode til at skrive til noget andet end System.out

problem opstår fordi Properties er en forklædt HashMap og en sådan ikke er sorteret efter key
Avatar billede andreas Nybegynder
02. januar 2007 - 17:09 #4
Det virker næsten ;) Jeg har lige fået rettet din kode til, så det passer ind i min klasse, men nedenfor kan du se jeg har to "fejl". Den ene er, at doctype ikke kommer på en ny linie, det forstår jeg så ikke helt, det andet er, at den laver et line break midt i den hash streng som er gemt i de to felter med admin og password. Kan du se grunden til dette?


<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<comment>Configuration file</comment>
<entry key="relayHost">127.0.0.1</entry>
<entry key="relayPort">25</entry>
<entry key="smtpPort">125</entry>
<entry key="smtpTimeout">120000</entry>
<entry key="webAdminPass">7iaw3Ur350mqGo7jwQrpkj9hiYB3Lkc/iBml1JQODbJ6wYX4oOHV+E+IvIh/1nsUNzLDBMxfqa2O
b1f1ACio/w==</entry>
<entry key="webAdminUser">x61Ey612Kl2gpFL56FT9weDnpSo4AV8j8+qx2AuTHdRyY036xxzTTrw10Wq3+4qQyB+XURPWx1ON
xp3Y3pB37A==</entry>
<entry key="webServerPort">8080</entry>
<entry key="webServerSSLPort">443</entry>
<entry key="webServerUseSSL">false</entry>
</properties>
Avatar billede andreas Nybegynder
03. januar 2007 - 00:26 #5
Hov, det er mig der har lavet en fejl. Smid et svar, da det du har lavet virker perfekt. Tak for det ;)
Avatar billede arne_v Ekspert
03. januar 2007 - 00:37 #6
ok
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester