2013-03-19 3 views
1

Я пытаюсь проанализировать XML-документ, который я получил из Google Geocode Api.Ошибка при разборе XML с использованием Java

Мой XML-файл. У меня есть ряд таких данных в одном файле. это только один узел

<?xml version="1.0" encoding="UTF-8"?> 
<GeocodeResponse> 
<status>OK</status> 
<result> 
    <formatted_address>Petroleum House, Jamshedji Tata Road, Churchgate, Mumbai, Maharashtra 400020, India</formatted_address> 
    <address_component> 
<long_name>Petroleum House</long_name> 
<short_name>Petroleum House</short_name> 
</address_component> 
<address_component> 
<long_name>Jamshedji Tata Road</long_name> 
<short_name>Jamshedji Tata Road</short_name> 
<type>route</type> 
</address_component> 
<address_component> 
<long_name>Churchgate</long_name> 
<short_name>Churchgate</short_name> 
<type>sublocality</type> 
<type>political</type> 
</address_component> 
<address_component> 
<long_name>Mumbai</long_name> 
<short_name>मॿंबई</short_name> 
<type>locality</type> 
<type>political</type> 
</address_component> 
<address_component> 
<long_name>Mumbai</long_name> 
<short_name>Mumbai</short_name> 
<type>administrative_area_level_2</type> 
<type>political</type> 
</address_component> 
<address_component> 
<long_name>Maharashtra</long_name> 
<short_name>MH</short_name> 
<type>administrative_area_level_1</type> 
<type>political</type> 
</address_component> 
<address_component> 
<long_name>India</long_name> 
<short_name>IN</short_name> 
<type>country</type> 
<type>political</type> 
</address_component> 
<address_component> 
<long_name>400020</long_name> 
<short_name>400020</short_name> 
<type>postal_code</type> 
</address_component> 
<geometry> 
<location> 
<lat>18.9291061</lat> 
<lng>72.8255146</lng> 
</location> 
<location_type>APPROXIMATE</location_type> 
<viewport> 
<southwest> 
<lat>18.9277189</lat> 
<lng>72.8240293</lng> 
</southwest> 
<northeast> 
<lat>18.9304168</lat> 
<lng>72.8267272</lng> 
</northeast> 
</viewport> 
<bounds> 
<southwest> 
<lat>18.9288559</lat> 
<lng>72.8251686</lng> 
</southwest> 
<northeast> 
<lat>18.9292798</lat> 
<lng>72.8255879</lng> 
</northeast> 
</bounds> 
</geometry> 
</result> 
</GeocodeResponse> 

Я пытаюсь использовать следующий код, но я получаю некоторые error.This это первый раз я пытаюсь разобрать XML.

import java.io.File; 
import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.DocumentBuilderFactory; 
import org.w3c.dom.Document; 
import org.w3c.dom.Element; 
import org.w3c.dom.Node; 
import org.w3c.dom.NodeList; 

public class parser { 

public static void main(String args[]) { 
    try { 

     File stocks = new File("filename.xml"); 
     DocumentBuilderFactory dbFactory = DocumentBuilderFactory 
       .newInstance(); 
     DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); 
     Document doc = dBuilder.parse(stocks); 
     doc.getDocumentElement().normalize(); 

     System.out.println("root of xml file" 
       + doc.getDocumentElement().getNodeName()); 
     NodeList nodes = doc.getElementsByTagName("address_component"); 
     System.out.println("=========================="); 

     for (int i = 0; i < nodes.getLength(); i++) { 
      Node node = nodes.item(i); 

      if (node.getNodeType() == Node.ELEMENT_NODE) { 
       Element element = (Element) node; 
       System.out.println("Name: " 
         + getValue("long_name", element)); 
       System.out.println("lat: " + getValue("lat", element)); 
       System.out.println("lon: " + getValue("lon", element)); 
      } 
     } 
    } catch (Exception ex) { 
     ex.printStackTrace(); 
    } 
} 

private static String getValue(String tag, Element element) { 
    NodeList nodes = element.getElementsByTagName(tag).item(0) 
      .getChildNodes(); 
    Node node = (Node) nodes.item(0); 
    return node.getNodeValue(); 
} 

``}

Ошибка я получаю

com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException: Invalid byte 3 of 3-byte UTF-8 sequence. 
at com.sun.org.apache.xerces.internal.impl.io.UTF8Reader.invalidByte(Unknown Source) 
at com.sun.org.apache.xerces.internal.impl.io.UTF8Reader.read(Unknown Source) 
at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.load(Unknown Source) 
at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.scanContent(Unknown Source) 
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(Unknown Source) 
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(Unknown Source) 
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source) 
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source) 
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source) 
at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(Unknown Source) 
at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(Unknown Source) 
at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(Unknown Source) 
at javax.xml.parsers.DocumentBuilder.parse(Unknown Source) 
at parser.main(parser.java:17) 

Прямая Ouput от Google

<?xml version="1.0" encoding="UTF-8"?> 
<GeocodeResponse> 
<status>OK</status> 
<result> 
<formatted_address>Petroleum House, Jamshedji Tata Road, Churchgate, Mumbai, Maharashtra 400020, India</formatted_address> 
<address_component> 
<long_name>Petroleum House</long_name> 
<short_name>Petroleum House</short_name> 
</address_component> 
<address_component> 
<long_name>Jamshedji Tata Road</long_name> 
<short_name>Jamshedji Tata Road</short_name> 
<type>route</type> 
</address_component> 
<address_component> 
<long_name>Churchgate</long_name> 
<short_name>Churchgate</short_name> 
<type>sublocality</type> 
<type>political</type> 
</address_component> 
<address_component> 
<long_name>Mumbai</long_name> 
<short_name>म�ंबई</short_name> 
<type>locality</type> 
<type>political</type> 
</address_component> 
<address_component> 
<long_name>Mumbai</long_name> 
<short_name>Mumbai</short_name> 
<type>administrative_area_level_2</type> 
<type>political</type> 
</address_component> 
<address_component> 
<long_name>Maharashtra</long_name> 
<short_name>MH</short_name> 
<type>administrative_area_level_1</type> 
<type>political</type> 
</address_component> 
<address_component> 
<long_name>India</long_name> 
<short_name>IN</short_name> 
<type>country</type> 
<type>political</type> 
</address_component> 
<address_component> 
<long_name>400020</long_name> 
<short_name>400020</short_name> 
<type>postal_code</type> 
</address_component> 
<geometry> 
<location> 
<lat>18.9291061</lat> 
<lng>72.8255146</lng> 
</location> 
<location_type>APPROXIMATE</location_type> 
<viewport> 
<southwest> 
<lat>18.9277189</lat> 
<lng>72.8240293</lng> 
</southwest> 
<northeast> 
<lat>18.9304168</lat> 
<lng>72.8267272</lng> 
</northeast> 
</viewport> 
<bounds> 
<southwest> 
<lat>18.9288559</lat> 
<lng>72.8251686</lng> 
</southwest> 
<northeast> 
<lat>18.9292798</lat> 
<lng>72.8255879</lng> 
</northeast> 
</bounds> 
</geometry> 
</result> 
</GeocodeResponse> 

Это прямой выход из Google

+0

Похоже файл 'запасов = новый файл ("filename.xml");' не загружает файл – bsiamionau

+0

Эта строка * не * загрузить файл. Он просто объявляет объект File. –

+0

Nice catch @BrianAgnew – bsiamionau

ответ

1

Я бы сказал, что он должен делать с кодировкой файла. Если вы находитесь на окна машины он может перевести файл XML в качестве формата окна ISO вместо UTF-8

Я хотел бы попробовать заменить

Document doc = dBuilder.parse(stocks); 

с:

Document doc = dBuilder.parse(new FileInputStream(stocks), "UTF8"))); 

Чтобы убедиться, что входной файл считывается как UTF-8

Редактировать: Как проверить кодировку файлов с помощью блокнота ++

Notepad++ encoding check

+0

и, как упоминает Брайан Агнью, убедитесь, что входной файл действительно UTF-8. –

+0

Данные, которые я получил, непосредственно из служб google и просто хранятся в файле. –

+0

Если вы открываете файл в текстовом редакторе (например, блокнот ++), какая кодировка говорит, что файл имеет? (http://npp-community.tuxfamily.org/documentation/notepad-user-manual/document-properties/encoding) –

3

Я подозреваю, файл ha были изменены при сохранении.

Ваш файл говорит UTF-8 вверху, но все, что его сохранил не имеет сохранил его как UTF-8. Вы должны быть в состоянии подтвердить это, просмотрев через другой инструмент, поддерживающий XML, например. браузер или, возможно, инструмент командной строки, такой как XMLStarlet.

Вы можете получить этот вход прямо из службы Google? т. е. не сохранять его в качестве промежуточного файла. Это стоило бы сделать, если бы только для подтверждения этой проблемы.

+0

Я добавил прямой вывод из службы Google –

+0

. Обратите внимание, что если вы * записываете *, который выводит файл, это письмо должно быть UTF-8 осведомлен. Если вы загрузите его в редактор и затем запишите его, этот * редактор * должен сохранить кодировку. В основном все в вашей цепочке трансформации должно быть известно UTF-8.Я бы использовал независимый инструмент, такой как XMLStarlet, чтобы проверить на каждом этапе, что коррупция не произошла. –

0

Вы можете попытаться разобрать ваш файл, как это:

File file = new File("filename.xml"); 
InputStream inputStream= new FileInputStream(file); 
Reader reader = new InputStreamReader(inputStream,"UTF-8"); 
InputSource is = new InputSource(reader); 
is.setEncoding("UTF-8"); 
Document doc = dBuilder.parse(is); 

Это просто дикая догадка Тхо ...

+0

Я пробовал ваш код. Я получаю следующую ошибку: [Fatal Error]: 80: 2: разметка в документе, следующей за корнем элемент должен быть хорошо сформирован. org.xml.sax.SAXParseException; lineNumber: 80; columnNumber: 2; Разметка в документе, следующей за корневым элементом, должна быть хорошо сформирована. \t в com.sun.org.apache.xerces.internal.parsers.DOMParser.parse (Unknown Source) \t в com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse (Unknown Source) \t на parser.main (parser.java:27) –

+0

, то ваш файл действительно просто не может быть utf8. 'iconv' приходит на ум ... – mindandmedia

Смежные вопросы