Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / очередная трабла с кодировкой xml / 16 сообщений из 16, страница 1 из 1
28.03.2005, 11:54
    #32983497
Naug
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
очередная трабла с кодировкой xml
Значит есть у меня некий в 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
28.03.2005, 13:33
    #32983766
Naug
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
очередная трабла с кодировкой xml
Сузил вопрос:при вызове метода getTextContent & l t ; превращается в < . Как с этим бороться?
...
Рейтинг: 0 / 0
28.03.2005, 13:37
    #32983774
А.Грасоff™ JE
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
очередная трабла с кодировкой xml
чем "вчитываешь"?
...
Рейтинг: 0 / 0
28.03.2005, 13:46
    #32983797
Naug
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
очередная трабла с кодировкой xml
Код: 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
28.03.2005, 14:03
    #32983843
wessen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
очередная трабла с кодировкой xml
Все, что связанно с 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
28.03.2005, 14:15
    #32983886
wessen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
очередная трабла с кодировкой xml
колдование над переменной data (вроде так надо)
Код: plaintext
1.
2.
3.
4.
5.
...
StreamSource s= new  StreamSource(data.getCharacterStream());
...
transformer.transform(s, result1);
...
...
Рейтинг: 0 / 0
28.03.2005, 14:17
    #32983893
А.Грасоff™ JE
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
очередная трабла с кодировкой xml
ты не въехал в суть.

есть:

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
28.03.2005, 14:18
    #32983901
А.Грасоff™ JE
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
очередная трабла с кодировкой xml
фукинг сервис. надо читать так:

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

Хочу уточнить вопрос - выяснилось что сама трансформация работает нормально. Ошибка в другом месте - когда я вытаскиваю содержимое нодов из Дома 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
28.03.2005, 15:09
    #32984099
wessen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
очередная трабла с кодировкой xml
А ты попробуй другой парсер, заработает, вот и ладно :)
...
Рейтинг: 0 / 0
28.03.2005, 15:15
    #32984120
Naug
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
очередная трабла с кодировкой xml
какой другой парсер
...
Рейтинг: 0 / 0
28.03.2005, 15:24
    #32984154
wessen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
очередная трабла с кодировкой xml
Naugкакой другой парсер
ну например xerces2

нужно будет в classpath указать пути к этим двум - xercesImpl.jar и xmlparserAPIs.jar
...
Рейтинг: 0 / 0
28.03.2005, 17:44
    #32984690
Naug
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
очередная трабла с кодировкой xml
Оффтоп: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
28.03.2005, 17:55
    #32984709
wessen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
очередная трабла с кодировкой xml
А можешь проще сделать, создай jar своей программы и bat файл к нему, примерно такого содержания:

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


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