Zmiana długości pól w dokumencie XML

0

Witam,
mam takie pytanie i jednoznacznie problem. Stworzyłem prosty program do edycji dokumentów XML, ale nie mogę wpaść na pomysł
Jak przetworzyć wartość danego pola, aby zawarta w nim treść nie przekroczyła określonej ilości znaków , np mamy na wejsciu:

<towary> <ad> wartość która trzeba ograniczyc</ad> </towary>
  • przetwarzamy, aby przeszło przykładowo pierwsze 15 znaków. Na wyjście dostajemy :
<towary> <ad> wartość która </ad> </towary>

Jeśli ktoś ma blade pojęcie jak takie przetworzenie zrobić proszę o jakieś wskazówki.

0

Nie rozumiem bardzo o co Ci chodzi ..
Ale jeśli stworzyłeś prosty program to pewnie użyłeś jakiegoś parsera plików więc tam po prostu napisz funkcje która ogranicza zapisywanie / badz wczytywanie określonej ilości znaków ??

0

no tak. Moj program kopiuje elementy, usuwa elementy, ale nie potrafie odwołać się do zawartości. I tu jest problem

0

Podaj istotne fragmenty kodu (cały kod). Będzie się można domyślić czego używasz do przetwarzania XML. Sama informacja, że masz problem to trochę mało.

0

import java.io.File;
import java.io.FileFilter;
import java.io.IOException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.*;
import org.xml.sax.SAXException;

public class XML {

    public static void main(String argv[]) { 

            try { 

                    String outputPath = "C:/Users/mwrona/XMLe/New/"; 

                    File fXmlDir = new File("C:/Users/mwrona/XMLe/"); 

                    DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance(); 
                    DocumentBuilder docBuilder = docFactory.newDocumentBuilder(); 

                    File[] xmls = fXmlDir.listFiles(new FileFilter() { 

                            @Override 
                            public boolean accept(File pathname) { 
                                    return pathname.getName().toLowerCase().endsWith(".xml"); 
                            } 
                    }); 

                    for (File xmlFile : xmls) { 
                            processFile(xmlFile, docBuilder, outputPath); 
                    } 

                    System.out.println("Done"); 

            } catch (ParserConfigurationException pce) { 
                    pce.printStackTrace(); 
            } catch (TransformerException tfe) { 
                    tfe.printStackTrace(); 
            } catch (IOException ioe) { 
                    ioe.printStackTrace(); 
            } catch (SAXException sae) { 
                    sae.printStackTrace(); 
            } 
    } 
  
        private static void processFile(File xmlFile, DocumentBuilder docBuilder, 
                    String outputPath) throws TransformerException, SAXException, 
                    IOException { 

            Document doc = docBuilder.parse(xmlFile); 
            

            Node nList = doc.getElementsByTagName("DeliveryPoint").item(0);
            Node nList2 = doc.getElementsByTagName("Order-Parties").item(0);
            

            /*Element newElement = doc.createElement("NowyObiekt");    //dodanie nowej pozycji
            newElement.appendChild(doc.createTextNode("NowaWartosc")); 
            nList.appendChild(newElement);*/ 
            NodeList list = nList.getChildNodes();

Element orig = (Element) nList;
//kopiowanie drzewa
Element New = (Element) orig.cloneNode(true);
nList2.appendChild(New);

NodeList nodes = doc.getElementsByTagName("DeliveryPoint");
for (int i = 0; i < nodes.getLength(); i++) {
doc.renameNode(nodes.item(1), null, "UltimateCustomer");
}

Node nList3 = doc.getElementsByTagName("UltimateCustomer").item(0);
NodeList list2 = nList3.getChildNodes();

            for (int i = 0; i < list2.getLength(); i++) { 

                    Node node = list2.item(i); 

                    //usuniecie
	   if ("ILN".equals(node.getNodeName())) {
		nList3.removeChild(node);
	   }
            } 

            TransformerFactory transformerFactory = TransformerFactory.newInstance(); 
            Transformer transformer = transformerFactory.newTransformer();
            DOMSource source = new DOMSource(doc); 
            StreamResult result = new StreamResult(new File(outputPath, "" + xmlFile.getName())); 
            transformer.transform(source, result); 
    } 

}

0

Dopisałem takie coś.... Zmienia to tylko zawartość elementu. I sprawa pierwsza :

  1. Odwołuje się tylko do pierwszego elementu ( item.0 )
    2.Zmienia tekst a ja chce go skrócić ;/

Node nList4 = doc.getElementsByTagName("Line-Item").item(0);
NodeList list3 = nList4.getChildNodes();

for(int i=0; i<list3.getLength();i++)
{
Node node1 = list3.item(i);

 if("ItemDescription".equals(node1.getNodeName()))
 {
     node1.setTextContent("xxxxxxxxxxxxx");
 }

}

1

Strasznie niejasno piszesz. Z tego co rozumiem, to wystarczy odczytać zawartość elementu, zrobić na nim substring i zapisać do tego samego elementu. W czym problem?

Czyli używasz Node.getTextContent()
string.substring()
Node.setTextContent()

0

node1.getTextContent().substring(0, 5); sprobowalem tego użyć ale kurcze nie działa. Nie zmienia długosci. Nie wiem czy to nie jest wywolane tym ze pole objete jest sekcja CDATA

0

Twoja instrukcja niczego nie zmienia.

node1.setTextContent(node.getTextContent().substring(0,5);
0

String Path =node1.getTextContent().substring(0, 15);
node1.setTextContent(Path);

chyba rozwiazałem jeden problem :) przepraszam, ze zasmiecam tak, ale chce sie podzielic uwagami. Nadal prosze o pomoc w tym zebym mogł odwoływać sie do kazdej pozycji ItemDescription a nie wybranej w indexie ;/

0

Masz już przecież jedną pętlę z list3 zrób tak samo wyzej. Zamiast pobierać od razu item(0) to zapisz całą listę do NodeList i "przejedź" w pętli analogicznie jak robisz szukając "Item-Description".

0

Nie radze sobie niestety.

1
  
 NodeList nList4 = doc.getElementsByTagName("Line-Item");
 for ( int idx = 0; idx < nList4.getLength(); idx++ )
 {
     Node n = nList4.item(idx);
     NodeList list3 = n.getChildNodes();
     for(int i=0; i<list3.getLength();i++)
     {
         Node node1 = list3.item(i);
     
         if("ItemDescription".equals(node1.getNodeName()))
         {
             node1.setTextContent("xxxxxxxxxxxxx");
         }
     }
 }

Nie testowane - bazowałem na Twoim wcześniejszym kodzie.

0

Działa pięknie :) Dziekuje bardzo za pomoc .

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.