powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / очередная трабла с кодировкой xml
16 сообщений из 16, страница 1 из 1
очередная трабла с кодировкой xml
    #32983497
Naug
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Значит есть у меня некий в UTF-8 (imo) записанный xml файл. (выдранный из второго OpenOffice-a)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
<text:section text:style-name="Sect1" text:name="comm1;1;2004-09-01">
                <text:p text:style-name="Standard">& l t ;Bloody</text:p>
                <text:p text:style-name="Standard">English & g t ; </text:p>
            </text:section>
            <text:section text:style-name="Sect1" text:name="comm2;2;2004-10-01">
                <text:p text:style-name="Standard">Р СѓСЃРѕ </text:p>
                <text:p text:style-name="Standard">туристо</text:p>
                <text:p text:style-name="Standard"/></text:section>
(в & l t ; я добавил пробелы -в оригинале их нет)
Дык вот, когда я эту заразу вчитываю в дом то ява превращает & l t ; в обычную угловую скобку, а крякозябры в правильный русскиий текст что, конечно приятно но вот только в результате парсер считает что у меня незакрытый элемент, а на попытку вчитать русский текст в дом выдаёт ошибку

Код: plaintext
1.
2.
3.
[Fatal Error] : 1 : 7 : Invalid  byte   2  of  2 - byte  UTF- 8  sequence.
Exception in thread "main" org.xml.sax.SAXParseException: Invalid  byte   2  of  2 - byte  UTF- 8  sequence.
	at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java: 264 )
	at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java: 292 )
...
Рейтинг: 0 / 0
очередная трабла с кодировкой xml
    #32983766
Naug
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сузил вопрос:при вызове метода getTextContent & l t ; превращается в < . Как с этим бороться?
...
Рейтинг: 0 / 0
очередная трабла с кодировкой xml
    #32983774
А.Грасоff™ JE
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чем "вчитываешь"?
...
Рейтинг: 0 / 0
очередная трабла с кодировкой xml
    #32983797
Naug
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
    public   static   void  transform(InputSource data, String style, String result) {    //transforms source xml file using style xsl file and saves result in result file , String sys, String pub
         try  {
            data.setEncoding("UTF-8");
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            factory.setNamespaceAware(true);
            DocumentBuilder builder = factory.newDocumentBuilder();
            document = builder.parse(data);
            TransformerFactory tFactory = TransformerFactory.newInstance();
            StreamSource stylesource =  new  StreamSource( new  FileInputStream(style));
            Transformer transformer = tFactory.newTransformer(stylesource);         //ads styling information to the transformation
            transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");            //sets the encoding declared in xml-file
//            if (sys != null) {
            // transformer.setOutputProperty(OutputKeys.DOCTYPE_SYSTEM, sys); //sets the system dtd
            // transformer.setOutputProperty(OutputKeys.DOCTYPE_PUBLIC, pub);  //sets the public dtd
//            }
            DOMSource source =  new  DOMSource(document);
            File fout =  new  File(result);                       //creates output file
            StreamResult result1 =  new  StreamResult( new  PrintWriter(fout, "UTF-8"));   //ensures that file is writen in a certain encoding (should match the encoding declared earlier)
            transformer.transform(source, result1);
...
Рейтинг: 0 / 0
очередная трабла с кодировкой xml
    #32983843
wessen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все, что связанно с DOM зачем?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
 public   static   void  transform(InputSource data, String style, String result) {    //transforms source xml file using style xsl file and saves result in result file , String sys, String pub
         try  {
            data.setEncoding("UTF-8");
            TransformerFactory tFactory = TransformerFactory.newInstance();
            StreamSource stylesource =  new  StreamSource( new  FileInputStream(style));
            Transformer transformer = tFactory.newTransformer(stylesource);         //ads styling information to the transformation
            transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");            //sets the encoding declared in xml-file
            File fout =  new  File(result);                       //creates output file
            StreamResult result1 =  new  StreamResult( new  PrintWriter(fout, "UTF-8"));   //ensures that file is writen in a certain encoding (should match the encoding declared earlier)
            transformer.transform(data, result1);

ну там еще над переменной data может поколдавать придется. И то, что будет все ок, гарантии не даю, сейчас негде проверить.
...
Рейтинг: 0 / 0
очередная трабла с кодировкой xml
    #32983886
wessen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
колдование над переменной data (вроде так надо)
Код: plaintext
1.
2.
3.
4.
5.
...
StreamSource s= new  StreamSource(data.getCharacterStream());
...
transformer.transform(s, result1);
...
...
Рейтинг: 0 / 0
очередная трабла с кодировкой xml
    #32983893
А.Грасоff™ JE
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ты не въехал в суть.

есть:

testxml.xml
Код: plaintext
1.
2.
3.
4.
<?xml version="1.0" encoding="UTF-8"?>
<texts>
 <text>&  l  t;Bloody</text>
</texts>


есть код:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
 package  test;

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

 import  javax.xml.parsers.*;
 import  java.io.*;

 public   class  TestXMLEntity {
   public   static   void  main(String[] args)  throws  ParserConfigurationException, IOException, SAXException {
    InputSource data =  new  InputSource( new  FileInputStream("d:\\testxml.xml"));

    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    DocumentBuilder builder = factory.newDocumentBuilder();
    Document document = builder.parse(data);
    Element root = document.getDocumentElement();
    NodeList texts = root.getElementsByTagName("text");
     for  ( int  i =  0 ; i < texts.getLength(); i++) {
      Element text = (Element) texts.item(i);

      String s = getNodeText(text);
      System.out.println("s = " + s);
    }
  }

   private   static  String getNodeText(Element node) {
    String nodeText = "";
    NodeList list = node.getChildNodes();
     for  ( int  i =  0 ; i < list.getLength(); i++) {
      Node child = list.item(i);
       if  (child.getNodeType() == Node.CDATA_SECTION_NODE) {
        CDATASection section = (CDATASection) child;
        nodeText = section.getData();
         break ;
      }  else   if  (child.getNodeType() == Node.TEXT_NODE) {
        nodeText = child.getNodeValue();
         break ;
      }
    }
     return  nodeText.trim();
  }
}

его результат:
Код: plaintext
1.
s = <Bloody

а надо:
Код: plaintext
1.
s = <Bloody
...
Рейтинг: 0 / 0
очередная трабла с кодировкой xml
    #32983901
А.Грасоff™ JE
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
фукинг сервис. надо читать так:

а надо:
Код: plaintext
s = &  lt;Bloody
...
Рейтинг: 0 / 0
очередная трабла с кодировкой xml
    #32983919
wessen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ты не въехал в суть.
Если это мне, то я въехал. Почему так происходит не знаю. Я просто немного оптимизировал метод, который показал Naug, потму как создавть DOM дерево там явно не надо.
...
Рейтинг: 0 / 0
очередная трабла с кодировкой xml
    #32984049
Naug
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасиб за совет по дому- чем меньше сущностей тем меньше ошибок.

Хочу уточнить вопрос - выяснилось что сама трансформация работает нормально. Ошибка в другом месте - когда я вытаскиваю содержимое нодов из Дома getTextContent выдаёт не то что я ожидаю. Для сравнения я в дебагере прочитал сначала исходный файл (по строчкам) и сравнил с тем что выдаёт getTextcontent получилось:

правильно:

tt: java.lang.String = " <p><Bloody</p>"
value: char[] = {char[25]@348}
[0] = ' ' 32
[1] = ' ' 32
[2] = ' ' 32
[3] = ' ' 32
[4] = ' ' 32
[5] = ' ' 32
[6] = ' ' 32
[7] = ' ' 32
[8] = '<' 60
[9] = 'p' 112
[10] = '>' 62
[11] = '&' 38
[12] = 'l' 108
[13] = 't' 116
[14] = ';' 59
[15] = 'B' 66
[16] = 'l' 108
[17] = 'o' 111
[18] = 'o' 111
[19] = 'd' 100
[20] = 'y' 121
[21] = '<' 60
[22] = '/' 47
[23] = 'p' 112
[24] = '>' 62
offset: int = 0
count: int = 25
hash: int = 0

getTextcontent:

[0] = '<' 60
[1] = 'B' 66
[2] = 'l' 108
[3] = 'o' 111
[4] = 'o' 111
[5] = 'd' 100
[6] = 'y' 121


C русским также заморочка - правильно:

[0] = ' ' 32
[1] = ' ' 32
[2] = ' ' 32
[3] = ' ' 32
[4] = ' ' 32
[5] = ' ' 32
[6] = ' ' 32
[7] = ' ' 32
[8] = '<' 60
[9] = 'p' 112
[10] = '>' 62
[11] = 'Р' 1056
[12] = ' ' 160
[13] = 'С' 1057
[14] = 'ѓ' 1107
[15] = 'С' 1057
[16] = 'Ѓ' 1027
[17] = 'Р' 1056
[18] = 'ѕ' 1109
[19] = ' ' 32
[20] = '<' 60
[21] = '/' 47
[22] = 'p' 112
[23] = '>' 62

А GetTextContent вертает:

[0] = 'Р' 1056
[1] = 'у' 1091
[2] = 'с' 1089
[3] = 'о' 1086
[4] = ' ' 32
...
Рейтинг: 0 / 0
очередная трабла с кодировкой xml
    #32984099
wessen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А ты попробуй другой парсер, заработает, вот и ладно :)
...
Рейтинг: 0 / 0
очередная трабла с кодировкой xml
    #32984120
Naug
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
какой другой парсер
...
Рейтинг: 0 / 0
очередная трабла с кодировкой xml
    #32984154
wessen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Naugкакой другой парсер
ну например xerces2

нужно будет в classpath указать пути к этим двум - xercesImpl.jar и xmlparserAPIs.jar
...
Рейтинг: 0 / 0
очередная трабла с кодировкой xml
    #32984690
Naug
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Оффтоп:err, прошу не банить за вопрос про classpath - я запустил прогу из идеи вот такой строкой:

"D:\Program Files\Java\jdk1.5.0\bin\java" -classpath D:\Xerces-J-bin.2.6.2\xerces-2_6_2\xmlParserAPIs.jar;D:\Xerces-J-tools262\tools\xercesImpl.jar -Didea.launcher.port=7538 -Didea.launcher.library=D:\IntelliJ-IDEA-4.5\bin\breakgen.dll -Dfile.encoding=windows-1251 com.intellij.rt.execution.application.AppMain Stylizer

получил:
java.lang.NoClassDefFoundError: com/intellij/rt/execution/application/AppMain
За что это он? Я так понимаю что он пытается зарустить com/intellij/rt/execution/application/AppMain, но зачем?

По существу:
Пофиксил структуру моих классов - с кодировкой русских букв всё наладилось. & l t ; фиксица нежелает
...
Рейтинг: 0 / 0
очередная трабла с кодировкой xml
    #32984709
wessen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А можешь проще сделать, создай jar своей программы и bat файл к нему, примерно такого содержания:

java -cp somePath/yourProgram.jar;somePath/xercesImpl.jar;somePath/xmlParserAPIs.jar somePackage.MainClass
...
Рейтинг: 0 / 0
очередная трабла с кодировкой xml
    #32984712
Naug
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
o.0 пошёл rtfm-ить. Лучше поздно чем никогда
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / очередная трабла с кодировкой xml
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]