2

我想使用 SAX Parser 来解析 XML 文档。当文档不包含任何命名空间时,它可以完美运行。但是,当我将命名空间添加到根元素时,我遇到了 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()

返回空值。

注意:我可以通过使用阅读“ http://www.xyz.com/q ”部分

doc.getRootElement().getNamespaceURI();

这意味着我仍然可以访问根元素。

任何人都知道如何克服这个问题?

提前致谢。

4

1 回答 1

1

您可以在一个 XML 文档中使用多个名称空间,并且每个元素都可以拥有自己的名称空间。为了访问普通文档(没有命名空间)中的文档元素,您可以使用类似getChildgetAttribute只有一个参数是子名称或属性名称的方法。这是您在代码中使用的。

但是为了访问命名空间版本,您必须使用这些方法的另一个覆盖,这些方法具有第二个参数类型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());
于 2013-10-03T19:23:25.440 回答