Sformatowany text w jTextPane do XML'a

0

Witam,

Mam mały problem z zapisaniem zawartości sformatowanego textu z jTextPane do XML'a. Potrzebuje do formatowania jedynie znacznika paragrafu (u mnie

), pogrubienia (b), i italic'a (i). I tak przykładowy artykuł XML'owy ma wyglądać tak:

<art>
<p>Zenek ma <b>kota</b> a ala <i>szczura</i></p>
<p><b><i>I co z tego wynika ?</i></b></p>
<p><b>&amp;&lt;br />&lt;a href=\"http://www.onet.pl/\">&lt;/a></b></p>
</art>

Otóż nie wiem czy istnieje jakiś prostszy sposób niż napisanie własnych funkcji do tego, ale no cóż pokusiłem się na napisanie takowych i oto moje wypociny:

public String writeXML()
    {
        StyledDocument doc = (StyledDocument)TextPane.getDocument();
        Element root = doc.getDefaultRootElement();
        
        String fullText = TextPane.getText();
        
        String xml = "";
        
        int i, j;
        
        for (i = 0; i < root.getElementCount(); i++)
        {
            xml += "<p>";
            Element par = root.getElement(i);
            for (j = 0; j < par.getElementCount(); j++ )
            {
                Element sty = par.getElement(j);
                AttributeSet attr = sty.getAttributes();
                
                
                
                String toAdd = fullText.substring(sty.getStartOffset(), sty.getEndOffset());
                
                toAdd = toAdd.replaceAll("&", "&amp;");
                toAdd = toAdd.replaceAll("<", "&lt;");
                
                if (StyleConstants.isBold(attr)) toAdd = "<b>" + toAdd + "</b>";
                if (StyleConstants.isItalic(attr)) toAdd = "<i>" + toAdd + "</i>";
                
                xml += toAdd;
            }
            xml += "</p>";           
        }
        
        xml = "<art>" + xml + "</art>";
        
        xml = xml.replaceAll("\n|\r", "");
        
        return xml;
    }

I jeszcze procedura do odczytu:

public void readXML(String xml)
    {
        XMLReader parser;
        try {
            parser = XMLReaderFactory.createXMLReader();
            
            parser.setContentHandler(new DefaultHandler() {
                SimpleAttributeSet attr = new SimpleAttributeSet();
                StyledDocument doc = (StyledDocument)TextPane.getDocument();;

                public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
                    if (localName == "b") StyleConstants.setBold(attr, true);
                    if (localName == "i") StyleConstants.setItalic(attr, true);
                }
                
                public void endElement(String uri, String localName, String qName) throws SAXException {
                    if (localName == "b") StyleConstants.setBold(attr, false);
                    if (localName == "i") StyleConstants.setItalic(attr, false);
                    if (localName == "p") {
                        try {
                            doc.insertString(doc.getLength(), "\n", attr);
                        } catch (BadLocationException ex) {
                            ex.printStackTrace();
                        }
                    }
                }
                
                public void characters(char ch[], int start, int length) throws SAXException {
                    String toAdd = "";
                    int i;
                    for (i = start; i < start + length; i++) toAdd += ch[i];
                    try {
                        doc.insertString(doc.getLength(), toAdd, attr);
                    } catch (BadLocationException ex) {
                        ex.printStackTrace();
                    }
                }
            });
            
            parser.parse(new InputSource(new StringReader(xml)));
            
        } catch (SAXException ex) {
            ex.printStackTrace();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }

Wiec w czym problem ? A taki że jak wczytam przykaldowgo XML'a (podanego wyżej) i pozniej go zapisze to zapisany kod nie jest taki sam jak wczytany - nawala formatowanie a dokladniej w 2 linii ostatnia litera jest traktowana jako osobny element i posiada inne atrybuty, chociaż wyswietlana jest ok. W trzeciej linii juz w ogóle nie wiem czemu druga od konca litera to osobny element, a końcowa została przeniesiona do następnej linii.

Przykład:

<art>
<p>Zenek ma <b>kota</b> a ala <i>szczura</i></p>
<p><b><i>I co z tego wynika ?</i></b></p>
<p><b>&amp;&lt;br />&lt;a href=\"http://www.onet.pl/\">&lt;/a></b></p>
</art>
<art>
<p>Zenek ma <b>kota</b> a ala <i>szczura</i></p>
<p><i><b>I co z tego wynika </b></i>?</p>
<p><b>&amp;&lt;br />&lt;a href=\"http://www.onet.pl/\">&lt;/</b>a</p>
<p>></p>
</art>

Moje podejrzenie pada na linijkę:

String toAdd = fullText.substring(sty.getStartOffset(), sty.getEndOffset());

Możliwe ze coś z offsetami jest nie tak, ale ja już nie wiem o co tu biega. Może ktoś z was wie czemu tak sie dzieje ? Może struktura Elemrntów jest inna w dokumencie ?

0

No i problem rozwiązałem ... jednak jak człowiek zmęczony to nie myśli. Problem siedział w metodzie. Pobierając cały string

String fullText = TextPane.getText();

Java domyślnie zamienia znaki "\n" na "\r\n" czyli systemowego "newline". I stad sie brało przesunięcie znaków. Więc wystarczyło zamiast

String toAdd = fullText.substring(sty.getStartOffset(), sty.getEndOffset());

dać takie cuś:

toAdd = TextPane.getText(rangeStart, rangeEnd - rangeStart);

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.