Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Как получить xml без кодов / 17 сообщений из 17, страница 1 из 1
14.08.2018, 14:04
    #39687484
SergeyAKa
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как получить xml без кодов
Пытаюсь создать строку с xml

Код: java
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.
  public static String  prepareXml() throws Exception {
      Document document;
      Element elRoot;
      //Element elParameters;
      String  xmlOut;    
      try {
        DocumentBuilderFactory factory  = DocumentBuilderFactory.newInstance();
        factory.setNamespaceAware(true);
        document = factory.newDocumentBuilder().newDocument();    
        elRoot = document.createElement("request");
        elRoot.setAttribute("id", "1234"); //Integer.toString(id));
        elRoot.setAttribute("user", "user");
        elRoot.setAttribute("user1", "йцукенгшщ");
        document.appendChild(elRoot);    

        //отформатировать
        StringWriter stringWriter = new StringWriter();            
        Transformer transformer = TransformerFactory.newInstance().newTransformer();            
        //форматирует в удобочитаемый вид
        transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "false"); 
        transformer.setOutputProperty(OutputKeys.INDENT, "yes");   
        transformer.setOutputProperty(OutputKeys.ENCODING, "windows-1251");
        transformer.transform(new DOMSource(document), new StreamResult(stringWriter)); 

        xmlOut =  stringWriter.toString();
                    
                    

        return xmlOut;
      
      }catch (Exception e){
          dbg("Error:"+e.getMessage());
          xmlOut = e.getMessage();
          throw e;
      }
      
      //try {



  }



но в итоге вместо кириллицы получаю коды

Код: xml
1.
2.
3.
<?xml version="1.0" encoding="windows-1251"?>
<request id="79" user="ESFL" user1="uiyuy&#1097;&#1110;&#1107;&#1098;&#1093;&#1101;&#1091;&#1112;&#1113;">
</request



запускается из под Oracle 11
Код: plaintext
1.
2.
3.
NLS_LANGUAGE=	AMERICAN
NLS_TERRITORY=	AMERICA
NLS_CHARACTERSET=	CL8MSWIN1251
...
Рейтинг: 0 / 0
14.08.2018, 15:21
    #39687545
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как получить xml без кодов
SergeyAKa,
Удали лишнее в коде, форматирование, атрибуты и т.д.
...
Рейтинг: 0 / 0
14.08.2018, 15:54
    #39687576
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как получить xml без кодов
Не знаю.

Теоретически стандарт XSL описывает disable-output-escaping. но это слишком уж "топором". Т.к. и escaping служебных символов будет отключен.
...
Рейтинг: 0 / 0
14.08.2018, 16:01
    #39687587
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как получить xml без кодов
Leonid Kudryavtsev,
У него скорее простейший случай без экранирования служебных надо.
...
Рейтинг: 0 / 0
14.08.2018, 16:06
    #39687594
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как получить xml без кодов
Тогда боюсь, вопрос в том, какой именно Transformer и библиотека используется. В данном случае, авторы библиотеки "так видили" well formed xml. В целом, соответствует стандарту.

В свое время с Oracle XML намучался, у них тоже было "нетрадиционное" поведение при форматирование XML. В результате пришлось плюнуть и с XML работать просто как с двоичными данными ((((
...
Рейтинг: 0 / 0
14.08.2018, 17:10
    #39687654
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как получить xml без кодов
Leonid Kudryavtsev,

Я добивался чтобы на 2 клика он открывался в Ослике.
И читался по русски).
Значит валидный)
...
Рейтинг: 0 / 0
14.08.2018, 18:31
    #39687703
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как получить xml без кодов
Ну да, Ваш результирующий документ кривой до жути.

Подозреваю, Вы заранее русские буквы в не верной кодировке впихнули. Тут только смотреть, что у Вас в среде разработки выбрано в качестве codepage для исходного кода и как компилируете.

Скомпилировал в своем Eclipse со стандартными библиотеками, Ваша проблема не повторилась.


Код: java
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.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
package test_jvm;

import java.io.StringWriter;

import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;
import org.w3c.dom.Element;

public class TextXML {
	 public static String  prepareXml() throws Exception {
	      Document document;
	      Element elRoot;
	      //Element elParameters;
	      String  xmlOut;    
	      try {
	        DocumentBuilderFactory factory  = DocumentBuilderFactory.newInstance();
	        factory.setNamespaceAware(true);
	        document = factory.newDocumentBuilder().newDocument();    
	        elRoot = document.createElement("request");
	        elRoot.setAttribute("id", "1234"); //Integer.toString(id));
	        elRoot.setAttribute("user", "user");
	        elRoot.setAttribute("user1", "йцукенгшщ");
	        document.appendChild(elRoot);    

	        //отформатировать
	        StringWriter stringWriter = new StringWriter();            
	        Transformer transformer = TransformerFactory.newInstance().newTransformer();            
	        //форматирует в удобочитаемый вид
	        transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "false"); 
	        transformer.setOutputProperty(OutputKeys.INDENT, "yes");   
	        transformer.setOutputProperty(OutputKeys.ENCODING, "windows-1251");
	        transformer.transform(new DOMSource(document), new StreamResult(stringWriter)); 

	        xmlOut =  stringWriter.toString();
	                    
	                    

	        return xmlOut;
	      
	      }catch (Exception e){
//	          dbg("Error:"+e.getMessage());
	          xmlOut = e.getMessage();
	          throw e;
	      }
	      
	      //try {



	  }
	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
		System.out.println( prepareXml() );
	}

}


Код: sql
1.
2.
<?xml version="1.0" encoding="windows-1251" standalone="no"?>
<request id="1234" user="user" user1="йцукенгшщ"/>


...
Рейтинг: 0 / 0
14.08.2018, 18:34
    #39687705
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как получить xml без кодов
Черт, не посмотрел, что вместо автора топика Petro123 ответил.

У автора в первом посте код один, а результат от совсем другого кода. Там даже атрибут user (без русских букв) не совпадает.
В коде elRoot.setAttribute("user", "user");
а в результате user="ESFL"
...
Рейтинг: 0 / 0
15.08.2018, 06:47
    #39687815
SergeyAKa
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как получить xml без кодов
Суть проблемы от этого не меняется

Код: plaintext
1.
2.
3.
4.
<?xml version="1.0" encoding="windows-1251"?>
<request id="1234" user="user" user1="щіѓъхэујљ">
</request>

...
Рейтинг: 0 / 0
15.08.2018, 06:48
    #39687816
SergeyAKa
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как получить xml без кодов
Хм... криво, но буковки подставились. Хотя все было в кодах
...
Рейтинг: 0 / 0
15.08.2018, 09:49
    #39687863
lleming
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как получить xml без кодов
щіѓъхэујљ
щіѓъхэујљ

Это одно и то же. Достаточно открыть первое в firefox и можно увидеть второе. Firefox видит xml entities и правильно их декодирует. Фактически это правильный xml, но читать такой неудобно.
Есть статейка на w3c про эти escape entities.
Просто в зависимости от используемой библиотеки есть строгие и нестрогие xml парсеры.
...
Рейтинг: 0 / 0
15.08.2018, 09:59
    #39687873
lleming
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как получить xml без кодов
Код: xml
1.
2.
&#1097;&#1110;&#1107;&#1098;&#1093;&#1101;&#1091;&#1112;&#1113;
щіѓъхэујљ



Вообщем считается что наиболее безопасно если в xml только ascii символы. Поэтому даже есть библиотека owasp esapi котороя может весь xml в entity перекодировать все что не ascii.
...
Рейтинг: 0 / 0
15.08.2018, 18:48
    #39688343
Partisan M
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как получить xml без кодов
чего не получается у автора, мне разбираться лень. Но в подобных случаях я при выводе применяю секции CDECL для строк на русском языке или которые могут содержать специальные символы . Это препятсвует их неправильном чтению или показу программами. Как добавить секцию CDECL - искать в описании используемой библиотеки получения XML.
...
Рейтинг: 0 / 0
15.08.2018, 18:58
    #39688346
Valentin Kolesnikov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как получить xml без кодов
SergeyAKa,

Можете протестировать конвертор json в xml в соседней ветке. 21643425

С уважением, Валентин
...
Рейтинг: 0 / 0
15.08.2018, 19:40
    #39688358
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как получить xml без кодов
Partisan MCDECL для строк на русском
Вот это
encoding="windows-1251"
достаточно.
...
Рейтинг: 0 / 0
15.08.2018, 20:23
    #39688370
Partisan M
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как получить xml без кодов
Petro123
encoding="windows-1251"
достаточно.

Недостаточно, если читающая этот XML программа ожидает кодировку UTF-8 или если русский текст содержит специальные символы, в том числе и " (что вполне вероятно в русском тексте).
...
Рейтинг: 0 / 0
15.08.2018, 22:24
    #39688411
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как получить xml без кодов
Partisan MНедостаточно, если читающая этот XML программа ожидает кодировку UTF-8
а зачем писать программы которые ожидают кодировку и не проверяют что в первой строке стоит:
encoding="windows-1251"
Partisan Mили если русский текст содержит специальные символы, в том числе и " (что вполне вероятно в русском тексте).
А ты ниже текст вставь в файл demo.xml и сделай 2 клика чтобы в Ослике открылся.
Что видим?
...
Ну а если припёрло, то экранируй:
" "
' '
< <
> >
& &

к сабжу экранирование не относится.

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
<?xml version="1.0" encoding="windows-1251"?> 
<serverpage> 
<sessions> 
    <plr> 
      <name>ООО "Рога и копыта"</name>
      <race>5</race> 
      <class>5</class> 
      <gender>0</gender> 
      <pvprank>0</pvprank> 
      <level>70</level> 
      <map>530</map> 
    </plr> 
  </sessions> 
</serverpage> 
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Как получить xml без кодов / 17 сообщений из 17, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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