使用JDOMXpath读取XML

时间:2012-11-15 15:03:57

标签: java xml xpath jdom

我有以下XML文件 -

<?xml version="1.0" encoding="UTF-8"?>
<BatchOrders xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <BatchHeader>
     <ServiceProvider>123456789</ServiceProvider>
     </BatchHeader>
   <OrderDetails>
     <MessageType>HelloWorld</MessageType>
  <IssueDateTime>22/01/2012 00:00:00</IssueDateTime> 
  <receivedDateTime>22/01/2012 00:00:00</receivedDateTime> 
     <Status>TestStatus</Status>
  </OrderDetails>
  </BatchOrders>

我想阅读内容并将它们设置为我创建的字段。所以我在下面有以下代码(没有一些被省略 - 我刚刚包含了我认为我需要展示的内容。下面是我创建的测试类 - 我也有一个编写器作为这个类的一部分写了一个XML文件正如我所期望的那样精确到磁盘。我面临的问题是正在阅读上面的文件并显示刚刚读取到控制台的内容。

File        myFileRead = null;
FileReader  myFileReader = null;

try {

myFileRead    = new File("C:/Path/myfile.xml");
myRecord = new myRecord();
myFileReader = new FileReader(myFileRead);

myXPathReader reader = new myXPathReader(myFileReader);

while (reader.hasNext())
{
       record = reader.next();

//prints out then to cosole
}

所以从上面我有myRecord类,我有例如ServiceProvider等的getter / setter。然后我还有一个myXpathReader类,它执行以下操作:

    private Document document;
    private List     batchorders;
    private Iterator iterator;

    public myXPathReader (Reader myFileReader)
    throws Exception 
    {
        SAXBuilder builder = new SAXBuilder();
        document = builder.build(myFileReader);      

        batchorders = new JDOMXPath("//BatchOrders").selectNodes(document);

        iterator = batchorders.iterator();
    }

   public int getSize() { return batchorders.size(); }

   public boolean hasNext() { return iterator.hasNext(); }


   public myRecord next() 
    throws Exception {

        Element element = (Element) iterator.next();


        myRecord record = new myRecord();

      record.setServiceProvider((new JDOMXPath("./ServiceProvider").stringValueOf(element)));
      //Some more sets ans close class etc...

现在,如果我调试代码并在iterator.next上的元素之后,我可以看到文件内容已被正确读取。但是在我的控制台上,ServiceProvider值实际上所有的值都被设置为空字符串“”。我是否在JDOMXPath上做了一些不正确的事情,以便从XML中提取值?

1 个答案:

答案 0 :(得分:2)

在您的示例中,XML ServiceProvider不是BatchOrders的子项,中间还有另一个级别(BatchHeader)。所以你的第二个XPath表达式应该是

BatchHeader/ServiceProvider

而不是./ServiceProvider