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>&<br /><a href=\"http://www.onet.pl/\"></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("&", "&");
toAdd = toAdd.replaceAll("<", "<");
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>&<br /><a href=\"http://www.onet.pl/\"></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>&<br /><a href=\"http://www.onet.pl/\"></</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 ?