使用XmlSlurper解析UTF-8 xml文件

时间:2011-10-18 12:39:17

标签: xml groovy atom-feed xmlslurper

我正在尝试使用XmlSlurper解析google atom。我的用例是这样的。

1)使用rest client将一个atom xml发送到服务器。

2)处理请求并在服务器端解析它。

我使用Groovy开发我的服务器并使用XmlSlurper作为解析器。但我无法成功并获得“prolog中不允许的内容”例外。然后我试着找出它发生的原因。我将原子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='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 个答案:

答案 0 :(得分:3)

尝试:

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 :(得分:1)

这是问题所在:

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

用平台默认编码读取文件。如果编码错误,您将错误地读取数据。

应该做的是让XML解析器为您处理它。它应该能够根据第一行数据检测编码本身。

我不熟悉XmlSlurper,但我希望能够解析输入流(在这种情况下只需给它FileInputStream处理文件本身的名称。