Разобрать XML-файл UTF-8 с помощью XmlSlurper - PullRequest
0 голосов
/ 18 октября 2011

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

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

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

Iразработать мой сервер с Groovy и использовать XmlSlurper в качестве парсера.Но я не смог добиться успеха и получить исключение «содержание не разрешено в прологе».И тогда я попытался найти причину, почему это произошло.Я сохранил свой атом xml в файл, который закодирован с помощью utf-8.А затем попытался прочитать файл и разобрать атом, я получаю то же исключение.Но затем я сохранил Atom 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='liz@gmail.com' />
  <gd:email rel='http://schemas.google.com/g/2005#home'
    address='liz@example.org' />
  <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='liz@gmail.com'
    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  

Ответы [ 2 ]

3 голосов
/ 18 октября 2011

Попробуйте:

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  

Вы идете длинный путь

1 голос
/ 18 октября 2011

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

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

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

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

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

...