You are not logged in.

  • Login

1

Tuesday, November 30th 2010, 11:55am

diff/patch des Subbaums auf gesamtBaum

Hallo @all,

ich stehen vor dem folgenden Problem:
Ich habe hier einen große XML datei(20MB). Der Baum hat in etwa 20000 Blätter.
Weil ich nicht am ganzen Baum änderungen vornehmen werden, extrahiere ich von dieser Datei eine Subbaum, indem ich einen großen Teil der Blätter des Baumes beim extrahieren lösche. An dieser kleineren XML datei mache ich einige Änderungen und lasse mir eine diff ausgeben. Und hier fängt mein Problem an: Alle diff-Anwendungen die ich bis jetzt benutzt hatte , geben mir in der diff, xpath Ausdrücke aus, die sich auf den kleinen Baum beziehen. Wie z.b. xpath = /..../Chid[250] : Holen die Referenz zum 250. Kindsknoten. Diese diff kann ich aber nicht auf die Große Datei anwenden, weil der 250. Kindsknoten ein Knoten sein kann(in der große XML-Datei), denn ich vorher nicht extrahiert hatte.(die Reihenfolge hat sich ja geändert).
Was ich gerne haben würde , wäre, dass er mir den XPath Ausdrück bzgl. eines attributes geben würde(=> für die Blätte). Bei mir wäre es das Attribute 'id' . Der ist bei mir eindeutig und wird als uuid generiert.

Kennt jemand die Lösung meines Problems ??

Zusammenfassung :

1.) großexml.xml -----> file1.xml (extrahiertes Subbaum)

2.) file1.xml + file2.xml(geändertes file1.xml) ----> diff.xml (XUpdate datei oder ähnliches)

3.) patch der großexml.xml mit diff.xml


Ich hoffe, ich konnte mein Problem erständlich erläutern


Grüße
Oc86

2

Saturday, December 4th 2010, 10:42am

Welches Tool benutzt du denn zum XML diffen? Da deine Anforderung schon ziemlich konkret ist, denke ich du wirst nicht um eine Eigenimplementierung herum kommen.
Lg

3

Sunday, December 5th 2010, 11:44am

ein Vorschlag von mir ohne gewähr

Hallo unbekannterweise
zum test

grosse xml Datei

Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?xml version="1.0" encoding="UTF-8"?>
<root>
	<item was="orginal">
		<einordung>1</einordung>
		<daten>erg1</daten>
		<pos>1</pos>
	</item>
	<item was="orginal">
		<einordung>2</einordung>
		<daten>erg2</daten>
		<pos>2</pos>
	</item>
	<item was="orginal">
		<einordung>3</einordung>
		<daten>erg3</daten>
		<pos>3</pos>
	</item>
</root>

diff xml Datei

Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?xml version="1.0" encoding="UTF-8"?>
<root>
	<item was="diff">
		<einordung>4</einordung>
		<daten>erg10</daten>
		<pos>1</pos>
	</item>

	<item was="diff">
		<einordung>1</einordung>
		<daten>erg5</daten>
		<pos>2</pos>
	</item>
</root>


es gibt mehre Möglichkeiten haben aber viele kleine Fehlerfallen deshalb hier die einfache Lösung

über die interne DTD ein neuen xml datei die beiden xml datei grosse und diff lädt.

XML Code

1
2
3
4
5
6
7
8
9
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE book [
<!ENTITY gesamt SYSTEM "grossfile.xml">
<!ENTITY diff SYSTEM "diff.xml">
]>
<rootges>
	&gesamt;
	&diff;
</rootges>

Hinweise:
über den Umweg derEntities werden die beiden Dateien geladen
Java Parser verlangen in der ersten Zeile der beiden xml dateien die xml anweisung

XML Code

1
<?xml version="1.0" encoding="UTF-8"?>

damit die Auflösung der Zeichen definiert(ISO-8859-1 oder UTF-8)
In der bei mir genannten xml datei ist folgender tree zu erkennen

XML Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<?xml version="1.0" encoding="UTF-8"?>
<rootges>
	<root>
		<item was="orginal">
			<einordung>1</einordung>
			<daten>erg1</daten>
			<pos>1</pos>
		</item>
		<item was="orginal">
			<einordung>2</einordung>
			<daten>erg2</daten>
			<pos>2</pos>
		</item>
		<item was="orginal">
			<einordung>3</einordung>
			<daten>erg3</daten>
			<pos>3</pos>
		</item>
	</root>
	<root>
		<item was="diff">
			<einordung>4</einordung>
			<daten>erg10</daten>
			<pos>1</pos>
		</item>
		<item was="diff">
			<einordung>1</einordung>
			<daten>erg5</daten>
			<pos>2</pos>
		</item>
	</root>
</rootges>


damit kann jetzt die Auswertung erfolgen


mit xls

XML Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
	<xsl:output method="xml" indent="yes"/>
	<xsl:variable name="root1" select="rootges/root[1]"/>
        [color=#ff0000]<!-- in grosserxml  -->[/color]
	<xsl:variable name="root2" select="rootges/root[2]"/>
        [color=#ff0000]<!-- in diffxml  -->[/color]
	<xsl:template match="/">
		<ergroot>
			<xsl:apply-templates select="rootges"/>
		</ergroot>
	</xsl:template>
	<xsl:template match="rootges">
		<xsl:apply-templates select="root[1]"/>
                [color=#ff0000]<!-- Änderung feststellen  -->[/color]
		<xsl:apply-templates select="root[2]">
		<xsl:with-param name="wo" select="2"/>
               [color=#ff0000]<!--  Neue in Diff anzeigen -->[/color]
		</xsl:apply-templates>
	</xsl:template>
	<xsl:template match="root">
	<xsl:param name="wo" select="1"/>
		<xsl:apply-templates select="item">
		<xsl:with-param name="wo" select="$wo"/>
		</xsl:apply-templates>
	</xsl:template>
	<xsl:template match="item">
	<xsl:param name="wo"/>
		<xsl:variable select="einordung" name="ein"/>
		<xsl:choose>
			<xsl:when test="$root2/item/einordung=$ein and $wo=1">
				<erg>
					<xsl:copy-of select="$root2/item[einordung=$ein]"/>
				</erg>
			</xsl:when>
			<xsl:when test="$root1/item[einordung=$ein] and $wo=2">
			<!-- mache nichts -->
			</xsl:when>
			<xsl:otherwise>
				<erg>
					<xsl:copy-of select="daten/.."/>
				</erg>
			</xsl:otherwise>
		</xsl:choose>
	</xsl:template>
</xsl:stylesheet>

Ergebnis

XML Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<?xml version='1.0' encoding='utf-8' ?>
<ergroot>
  <erg>
    <item was="diff">		
      <einordung>1</einordung>		
      <daten>erg5</daten>		
      <pos>2</pos>	
    </item>
  </erg>
  <erg>
    <item was="orginal">		
      <einordung>2</einordung>		
      <daten>erg2</daten>		
      <pos>2</pos>	
    </item>
  </erg>
  <erg>
    <item was="orginal">		
      <einordung>3</einordung>		
      <daten>erg3</daten>		
      <pos>3</pos>	
    </item>
  </erg>
  <erg>
    <item was="diff">		
      <einordung>4</einordung>		
      <daten>erg10</daten>		
      <pos>1</pos>	
    </item>
  </erg>
</ergroot>


hoffe das hilft oder nehme kontakt auf

4

Tuesday, December 7th 2010, 10:22am

@xml_looser : danke für deine Hilfe.
Ich werde das jetzt aber selber implementieren, den die XMl Datei enthalten Geometriesche Daten und ich muss erkennen ob eines Objektes sich geändert hat oder nicht !!

Social bookmarks