Announcement

Collapse
No announcement yet.

XML lesen und wieder schreiben

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • XML lesen und wieder schreiben

    Hallo Forum,

    ich habe folgendes (eigentlich einfaches Problem): Ich habe eine XML Datei in der geprüft werden soll, ob die darin befindlichen Elemente ein Unterelement mit bestimmten Namen haben. Wenn das so ist, sollen nur diese Elemente wiederum in ein zweites XML geschrieben werden. Also ein Filter auf die Struktur, wo am Ende nur noch die Elemente enthalten sind, die dem Filter entsprechen. Ich bekomme es aber einfach nicht hin...
    Das Auslesen und Filter klappt, nur das Schreiben nicht.

    Beispiel der XML Struktur:
    Code:
    			<Root>
    				<Feature id='234'>
    					<Usage>Standard</Usage>
    					<Quantity>1.3</Quantity>
    					<SubFeatures>
    						<Feature id='163'>
    							<Usage>Standard</Usage>
    							<Quantity>8.0</Quantity>
    							<SubFeatures></SubFeatures>
    						</Feature>
    					</SubFeatures>
    				</Feature>
    				<Feature id='578'>
    					<Usage>Standard</Usage>
    					<Quantity>2.7</Quantity>
    					<SubFeatures></SubFeatures>
    				</Feature>		
    				<Feature id='911'>
    					<Usage>Standard</Usage>
    					<Quantity>8.0</Quantity>
    					<SubFeatures></SubFeatures>
    				   <Pending id='888'/>
    				</Feature>
    				<Feature id='001'>
    					<Usage>Standard</Usage>
    					<Quantity>1.0</Quantity>"
    				   <Pending id='999'/>
    					<SubFeatures></SubFeatures>
    				</Feature>			
    			</Root>
    Mein letzter Ansatz:
    Code:
    		SAXBuilder builder = new SAXBuilder();
    		InputStream isXMLBOM = new ByteArrayInputStream(sBOMXML.getBytes()); // Das ist die XML Struktur oben als String
    		Document docXMLIn = builder.build(isXMLBOM);
    
    		Element elementEngineeringBOM = docXMLIn.getRootElement();
    		
    		//output XML
    		Element elementNewStructure = new Element(elementEngineeringBOM.getName());
    		Document docXMLOut = new Document(elementNewStructure);
    		docXMLOut.setDocType(docXMLIn.getDocType());
    
    		Filter filter = new ElementFilter("Pending");
    		Iterator<Content> it = docXMLIn.getDescendants(filter);
    		while (it.hasNext())
    		{
    			Content content = (Content) it.next();
    			Element elementParent = content.getParentElement();
    			//hier geht es schief...
    			elementNewStructure.addContent(elementParent);
    		}
    crasht mit der Fehlermeldung:
    Code:
    System Error: #5000001: IllegalAddException: The Content already has an existing parent "Root"
    Das sollte doch eigentlich relativ einfach zu lösen sein, oder? Oder muss ich doch durch alle Unterknoten und die dann auslesen und als neue Elemente hinzufügen?

    Gruß,
    MAF1981
    Zuletzt editiert von MAF1981; 07.07.2011, 17:48.

  • #2
    Java bringt XML Unterstützung und XPATH Unterstützung doch von Hause aus mit. Warum den SAXBUILDER?

    Element elementParent = content.getParentElement();
    Wenn das erste Element dann
    <Feature id='234'>
    ist, dürfte der Parent davon dann das RootElement sein. Und den hast du schon eingefügt. Ein einfaches debuggen kann das verifizieren
    Christian

    Comment


    • #3
      Das Parent vom ersten "Pending" was gefunden wird (mit id=888) ist das <Feature id='911'>, das gibt er mir auch beim Debuggen aus. Und diesen kompletten Knoten <Feature id='911'> möchte ich nun wieder in ein neues XML schreiben, genauso wie den zweiten gefundenen (<Feature id='001'>) und in dem steht bisher nur einmal der Root drinnen:

      Element elementNewStructure = new Element(elementEngineeringBOM.getName());
      Da ist eben mein Problem, wo ich nicht weiterkomme.

      Gruß

      Comment


      • #4
        [highlight=java]

        Filter filter=new ElementFilter("Pending");
        @SuppressWarnings("unchecked")
        Iterator<Content> it=docXMLIn.getDescendants(filter);
        while(it.hasNext())
        {
        Content content=it.next();
        Element elementParent=(Element)content.getParentElement(). clone();
        elementNewStructure.addContent(elementParent);
        }

        [/highlight]
        Christian

        Comment

        Working...
        X