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

Odpowiedz Nowy wątek
2012-08-07 14:45
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.

Pozostało 580 znaków

2012-08-07 16:17
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 ??

Pozostało 580 znaków

2012-08-08 09:54
0

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

To jak Ty je kopiujesz ?:> - Antoniossss 2012-08-09 00:46

Pozostało 580 znaków

2012-08-08 19:54
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.

Pozostało 580 znaków

2012-08-09 07:45
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); 
    } 

}

Pozostało 580 znaków

2012-08-09 09:02
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");
    }
    }

Pozostało 580 znaków

2012-08-09 09:10

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()

edytowany 1x, ostatnio: sephirot8608, 2012-08-09 09:12

Pozostało 580 znaków

2012-08-09 09:11
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

Pozostało 580 znaków

2012-08-09 09:18
0

Twoja instrukcja niczego nie zmienia.

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

To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell
edytowany 1x, ostatnio: bogdans, 2012-08-09 09:18

Pozostało 580 znaków

2012-08-09 09:25
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 ;/

Pozostało 580 znaków

2012-08-09 10:02
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".

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0