2013-10-03 2 views
2

Я хочу проанализировать XML-документ с помощью SAX Parser. Когда документ не содержит пространства имен, он отлично работает. Однако, когда я добавляю пространства имен в корневой элемент, я сталкиваюсь с исключением NullPointerException.Java SAX Parser Namespace Throws NullPointerException

Вот мой рабочий XML документ:

<?xml version="1.0" encoding="utf-8"?> 
<Root> 
    <Date>01102013</Date> 
    <ID>1</ID> 
    <Count>3</Count> 
    <Items> 
     <Item> 
     <Date>01102013</Date> 
     <Amount>100</Amount> 
     </Item> 
     <Item> 
     <Date>02102013</Date> 
     <Amount>200</Amount> 
     </Item> 
    </Items> 
</Root> 

Это проблематично версия:

<?xml version="1.0" encoding="utf-8"?> 
<Root xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.xyz.com/q"> 
    <Date>01102013</Date> 
    <ID>1</ID> 
    <Count>3</Count> 
    <Items> 
     <Item> 
     <Date>01102013</Date> 
     <Amount>100</Amount> 
     </Item> 
     <Item> 
     <Date>02102013</Date> 
     <Amount>200</Amount> 
     </Item> 
    </Items> 
</Root> 

Вот мой код:

Document doc = null; 
SAXBuilder sax = new SAXBuilder(); 
sax.setFeature("http://xml.org/sax/features/external-general-entities", false); 
// I set this as true but still nothing changes 
sax.setFeature("http://xml.org/sax/features/external-parameter-entities", false); 
sax.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true); 

doc = sax.build(xmlFile); // xmlFile is a File object which is a function parameter 

Root root = new Root(); 
Element element = doc.getRootElement(); 
root.setDate(element.getChild("Date").getValue()); 
root.setID(element.getChild("ID").getValue()); 
. 
. 
. 

Когда я использую первый XML, он работает нормально. Когда я использую второй XML

element.getChild("Date").getValue() 

возвращает null.

Примечание: я могу читать «http://www.xyz.com/q» часть с помощью

doc.getRootElement().getNamespaceURI(); 

, который означает, что я все еще могу получить доступ к корневому элементу.

У кого-нибудь есть идея, как это преодолеть?

Заранее спасибо.

ответ

1

Вы можете использовать несколько пространств имен в документе XML, и каждый элемент может иметь каждое собственное пространство имен. Чтобы получить доступ к элементам документа в обычном документе (без пространств имен), вы можете использовать такие методы, как getChild или getAttribute, который имеет только один аргумент, который является именем или именем дочернего элемента. Это то, что вы использовали в своем коде.

Но для доступа к версии с именами вам необходимо использовать другое переопределение этих методов, которые имеют второй параметр типа Namespace. Таким образом, вы можете запросить элемент для своей дочерней или базы атрибутов в заданном пространстве имен. Так что если вы хотите прочитать свой второй документ (который имеет пространство имен) ваш код будет выглядеть примерно так:

// The first parameter is the prefix of this namespace in your document. in your sample it's an empty string 
Namespace ns = Namespace.getNamespace("", "http://www.xyz.com/q"); 

Element element = doc.getRootElement(); 
root.setDate(element.getChild("Date", ns).getValue()); 
root.setID(element.getChild("ID", ns).getValue()); 
+0

Я поместил это так, и она работала: element.getChild («Дата», документ .getNamespace()). getValue() Спасибо за ответ! –