Hierachisches XML aus Flatfile

karstenkurt

Mitglied
Hallo,

ich habe eine csv-Datei mit folgenden Einträgen (insg. ca. 10000):
4712;Testname, 17-00-00-00;
4713;Testname, 17-00-00-01;
4714;Testname, 17-00-01-01;
..
9712;Testname, 18-00-00-00;
9713;Testname, 18-00-10-00;
....

Dies möchte ich gerne in ein hierachisches XML überführen.
Code:
<root>
<child value="17-00-00-00">
  <Name>Testname</Name>
  <Wert>4712</Wert>
  <Child value"17-00-00-01">
    <Name>Testname</Name>
    <Wert>4713</Wert>
    <Child value"17-00-01-01">
      <Name>Testname</Name>
      <Wert>4714</Wert>
    <Child>
  <Child>
<child value="18-00-00-00">
  <Name>Testname</Name>
  <Wert>9712</Wert>
   <Child value"18-00-10-00">
      <Name>Testname</Name>
      <Wert>9713</Wert>
   <Child>
</root>

Wie gehe ich da am geschicktesten vor? XSLT? Transformieren (wei?)?

Bin dankbar für jede Idee.

Gruß
 
Dir fehlt noch ein </child>

Schreibst du das XML einfach so oder mit irgendeiner API? Einige APIs verfügen bereits über eine Indent oder Pretty Print Funktion.
 
sogar noch 2.

Code:
<root>
<child value="17-00-00-00">
  <Name>Testname</Name>
  <Wert>4712</Wert>
  <child value"17-00-00-01">
    <Parent>17-00-00-00</Parent>
    <Name>Testname</Name>
    <Wert>4713</Wert>
    <child value"17-00-01-01">
      <Parent>17-00-00-01</Parent>
      <Name>Testname</Name>
      <Wert>4714</Wert>
    <child >
  <child >
</child >
<child value="18-00-00-00">
  <Name>Testname</Name>
  <Wert>9712</Wert>
   <child value"18-00-10-00">
     <Parent>18-00-00-00</Parent>      
     <Name>Testname</Name>
      <Wert>9713</Wert>
   <child >
</child >
</root>
Erzeugt wird das Document so
Code:
  doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
  Element rootElement = doc.createElement("root");
  doc.appendChild(rootElement);
  Element subNode = null;
  Text text = null;
  for (int i = 0; i < ar.size(); i++) {	
   String[] zeile = (String) ar.get(i); 
   Element child = doc.createElement("child ");
    child.setAttribute("Parent",zeile[1]);
    subNode = doc.createElement("Parent");
    text = doc.createTextNode(zeile[2]);
    subNode.appendChild(text);
    child.appendChild(subNode);
    subNode = doc.createElement("Wert");
    text = doc.createTextNode(zeile[3]);
    subNode.appendChild(text);
    child.appendChild(subNode);
    subNode = doc.createElement("Name");
    text = doc.createTextNode(zeile[4]);
    subNode.appendChild(text);
    child.appendChild(subNode);
    rootElement.appendChild(child);
}
 
Dann nimm doch den XMLOutputer mit Format.getPrettyFormat(): http://www.jdom.org/docs/apidocs/org/jdom/output/XMLOutputter.html

Hallo zeja,

es geht mir nicht um die Einrückungen , sondern darum ein Flatfile hierachisch auszubauen. Habe es nun auch mit dem Link aus meinem vorherigen Post hinbekommen, allerdings ist der Transformer bei ca. 25000 Einträgen 7 Minuten mit der Transformation beschäftigt.

Ich verwende das folgende XSLT
Code:
<?xml version="1.0" encoding="ISO-8859-1" ?>
<xslt:stylesheet xmlns:xslt="http://www.w3.org/1999/XSL/Transform" version="1.0">
	<xslt:template match="/eClasses">
		<root>
		<xslt:apply-templates select="Child[not(@Parent)]"/>
		</root>
	</xslt:template>
	<xslt:template match="Child">
		<Child>
		<xslt:if test="@Parent">
			<xslt:attribute name="Parent">
				<xslt:value-of select="@Parent" />
			</xslt:attribute>	
		</xslt:if>
		<xslt:if test="@value">
			<xslt:attribute name="value">
				<xslt:value-of select="@value" />
			</xslt:attribute>	
		</xslt:if>
		<!-- wert des Elements ausgeben -->
		<Ausgabe><xslt:value-of select="Ausgabe" /></Ausgabe>
		<Wert><xslt:value-of select="wert" /></Wert>
		<name><xslt:value-of select="Name" /></name>
		<xslt:variable name="Label" select="Ausgabe" />
		<xslt:apply-templates select="../Child[@Parent=$Label]"/>
		</Child>
	</xslt:template>
</xslt:stylesheet>
auf eine solche XML-Datei mit ca. 25000 Einträgen
Code:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<root>
<Child value="17-00-00-00"><Wert>64400101</Wert><Ausgabe>17-00-00-00</Ausgabe><Name>Name1</Name></Child>
<Child Parent="17-00-00-00" value="17-01-00-00"><Wert>64500101</Wert><Ausgabe>17-01-00-00</Ausgabe><Name>Name1</Name></Child>
<Child Parent="17-01-00-00" value="17-01-01-00"><Idcl>64600101</Idcl><Ausgabe>17-01-01-00</Ausgabe><Name>Name1</Name></Child>
<Child Parent="17-01-01-00" value="17-01-01-90"><Idcl>64700101</Idcl><Ausgabe>17-01-01-90</Ausgabe><Name>Name1</Name></Child>
</root>
Die Ausgabe sieht dann so aus (Sieht nicht xml-konform aus, ist es im Gesamtkontext aber)
Code:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<Class value="17-00-00-00"><Ausgabe>17-00-00-00</Ausgabe><Wert>64400101</Wert><name>Name1</name>
  <Class Parent="17-00-00-00" value="17-01-00-00"><Ausgabe>17-01-00-00</Ausgabe><Wert>64500101</Wert><name>Name1</name>
  <Class Parent="17-01-00-00" value="17-01-01-00"><Ausgabe>17-01-01-00</Ausgabe><Wert>64600101</Wert><name>Name1</name>
  <Class Parent="17-01-01-00" value="17-01-01-90"><Ausgabe>17-01-01-90</Ausgabe><Wert>64700101</Wert><name>Name1</name>
  </Class>
</Class>
  <Class Parent="17-01-00-00" value="17-01-02-00"><Ausgabe>17-01-02-00</Ausgabe><Wert>64800101</Wert><name>Name1</name>
    <Class Parent="17-01-02-00" value="17-01-02-90"><Ausgabe>17-01-02-90</Ausgabe><Wert>64900101</Wert><name>Name1</name>  </Class>
</Class>
...........
</root>

Kann da was tunen?
Die Ausgabe-Methode sieht so aus:
Code:
TransformerFactory tFactory = TransformerFactory.newInstance();
Transformer transformer;
try {
  transformer = tFactory.newTransformer(new javax.xml.transform.stream.StreamSource(
							"test.xsl"));
  transformer.transform(new javax.xml.transform.stream.StreamSource(
					"test.xml"), new javax.xml.transform.stream.StreamResult(
					new FileOutputStream("ausgbe.xml")));

Gruß
KK
 
Zurück