Разобрать XML-файл UTF-8 с помощью XmlSlurper

Я пытаюсь разобрать атом Google с помощью XmlSlurper. Мой вариант использования примерно такой.

1) Отправьте атом xml на сервер с остальным клиентом.

2) Обработать запрос и проанализировать его на стороне сервера.

Я разрабатываю свой сервер с помощью Groovy и использую XmlSlurper в качестве синтаксического анализатора. Но я не смог добиться успеха и получить исключение «контент не разрешен в прологе». И тогда я попытался найти причину, почему это произошло. Я сохранил свой атом xml в файл, закодированный с помощью utf-8. А затем попытался прочитать файл и проанализировать атом, я получаю то же исключение. Но затем я сохранил атом xml в файл, который закодирован с помощью ansi. И я успешно разобрал атом xml. Поэтому я думаю, что проблема в XmlSlurper и «UTF-8».

Вы имеете представление об этом ограничении? Мой атом xml должен быть utf-8, так как я могу разобрать этот атом xml? Спасибо за вашу помощь.

XML:

<?xml version="1.0" encoding="UTF-8"?>
<entry xmlns:atom='http://www.w3.org/2005/Atom'
    xmlns:gd='http://schemas.google.com/g/2005'>
  <category scheme='http://schemas.google.com/g/2005#kind'
    term='http://schemas.google.com/contact/2008#contact' />
  <title type='text'>Elizabeth Bennet</title>
  <content type='text'>Notes</content>
  <gd:email rel='http://schemas.google.com/g/2005#work'
    address='[email protected]' />
  <gd:email rel='http://schemas.google.com/g/2005#home'
    address='[email protected]' />
  <gd:phoneNumber rel='http://schemas.google.com/g/2005#work'
    primary='true'>
    (206)555-1212
  </gd:phoneNumber>
  <gd:phoneNumber rel='http://schemas.google.com/g/2005#home'>
    (206)555-1213
  </gd:phoneNumber>
  <gd:im address='[email protected]'
    protocol='http://schemas.google.com/g/2005#GOOGLE_TALK'
    rel='http://schemas.google.com/g/2005#home' />
  <gd:postalAddress rel='http://schemas.google.com/g/2005#work'
    primary='true'>
    1600 Amphitheatre Pkwy Mountain View
  </gd:postalAddress>
</entry>

читать файл и анализировать:

 String file = "C:\\Documents and Settings\\user\\Desktop\\create.xml";
 String line = "";
 StringBuilder sb = new StringBuilder();
 BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
 while ((line = br.readLine()) !=null) {
     sb.append(line);
 }
 System.out.println("sb.toString() = " + sb.toString());

 def xmlf = new XmlSlurper().parseText(sb.toString())
    .declareNamespace(gContact:'http://schemas.google.com/contact/2008',
        gd:'http://schemas.google.com/g/2005')

   println xmlf.title  

person erimerturk    schedule 18.10.2011    source источник
comment
Что именно вы имеете в виду, говоря, что я сохранил атом xml в файл, закодированный с помощью ansi? Как именно вы анализируете XML? Некоторый код был бы полезен...   -  person Jon Skeet    schedule 18.10.2011
comment
я имею в виду, что я создаю файл с блокнотом ++, который имеет тип кодировки ansi. Сделал копипаст.   -  person erimerturk    schedule 18.10.2011
comment
У вас также есть пример XML, который не работает?   -  person tim_yates    schedule 18.10.2011
comment
@erimerturk: ​​Это означает, что вы уже применили несколько проходов декодирования/кодирования - я не удивлен, что это неправильно. По возможности старайтесь не заниматься кодированием. См. мой ответ для более подробной информации, но неясно, почему у вас вообще есть файл. Я предполагаю, что на самом деле XML исходит из сетевого потока, поэтому заставьте XmlSlurper анализировать этот поток как InputStream.   -  person Jon Skeet    schedule 18.10.2011


Ответы (2)


Пытаться:

String file = "C:\\Documents and Settings\\user\\Desktop\\create.xml"

def xmlf = new XmlSlurper().parse( new File( file ) ).declareNamespace( 
        gContact:'http://schemas.google.com/contact/2008',
        gd:'http://schemas.google.com/g/2005' )
println xmlf.title  

Вы идете долгим путем

person tim_yates    schedule 18.10.2011
comment
Как я уже говорил, мне нужно отправить этот xml атома на сервер с клиентом для отдыха. Я использовал файл для поиска проблемы. Этот подход работал с файлом, тогда я попробую это для ServletInputStream, обратная связь. Спасибо - person erimerturk; 18.10.2011
comment
Я попробовал XmlSlurper().parse(request.getInputStream()), но знаю, что получаю исключение «Преждевременный конец файла», но я проанализировал тот же xml с помощью этого XmlSlurper().parse(new File(file)). что мне не хватает? - person erimerturk; 18.10.2011

Это проблема:

BufferedReader br = new BufferedReader(
    new InputStreamReader(new FileInputStream(file)));
while ((line = br.readLine()) !=null) {
    sb.append(line);
}

Это чтение файла с кодировкой платформы по умолчанию. Если кодировка неверна, вы будете читать данные неправильно.

Что вы должны сделать, так это позволить синтаксическому анализатору XML сделать это за вас. Он должен уметь определять саму кодировку на основе первой строки данных.

Я не знаком с XmlSlurper, но я ожидаю, что он либо сможет анализировать входной поток (в этом случае просто дайте ему FileInputStream) или обрабатывать имя самого файла.

person Jon Skeet    schedule 18.10.2011