0

我有以下 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 的值,实际上所有的值都被设置为空字符串“”。为了从 XML 中提取值,我在 JDOMXPath 上做错了什么吗?

4

1 回答 1

2

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

BatchHeader/ServiceProvider

代替./ServiceProvider

于 2012-11-15T15:25:15.867 回答