2

次のXMLドキュメントがあるとします。

<?xml version="1.0" encoding="UTF-8"?>
<InlinePurchaseOrder>
   <largeMessage>
      <BuyersID>20031234-1</BuyersID>
      <IssueDate>2003-01-23</IssueDate>
      <LineExtensionTotalAmount amountCurrencyID="USD" amountCurrencyCodeListVersionID="0.3">438.50</LineExtensionTotalAmount>
      <BuyerParty>
         <Party>
            <PartyName>
               <Name>Bills Microdevices</Name>
               <Name>BM</Name>
               <Name>BMic</Name>
            </PartyName>
         </Party>
      </BuyerParty>
   </largeMessage>
</InlinePurchaseOrder>

ノードに移動するためにXPathを発行してい<PartyName>ます。次に、2番目のXPathを発行してすべての<Name>ノードを取得し、それらの位置を記録します。

なんらかの理由でNodeRecorder.iterate()、ノードが正しく記録されていても、すぐに-1を返しているので、と呼んresetPointer()で順方向に進んでいます。このタイプのロジック(ただし、異なるXPath)を使用した他のドキュメントが機能しましたが、これは機能しません。何か案は?

デモコード:

File f = new File("noderecorder.xml");
FileInputStream fis = new FileInputStream(f);
byte[] b = new byte[(int) f.length()];
fis.read(b);
fis.close();

VTDGen vg = new VTDGen();
vg.setDoc(b);
vg.parse(false);

VTDNav vn = vg.getNav();

AutoPilot partyNameXPath = new AutoPilot(vn);
partyNameXPath.selectXPath("largeMessage/BuyerParty/Party/PartyName");

// Find PartyName
while (partyNameXPath.evalXPath() != -1) {
    System.out.println("Found: " + vn.getCurrentIndex() + " " + 
                       vn.toRawString(vn.getCurrentIndex()));

    NodeRecorder nr = new NodeRecorder(vn);

    // Find all Names and record their positions
    AutoPilot nameXPath = new AutoPilot(vn);
    nameXPath.selectXPath("Name");            

    while (nameXPath.evalXPath() != -1) {
        System.out.println("Found: " + vn.getCurrentIndex() + " " +
                           vn.toRawString(vn.getCurrentIndex()));
        nr.record();
    }

    nr.resetPointer();

    System.out.println("Index before nr.iterate: " + vn.getCurrentIndex());

    // Do some other work...

    // Now go and iterate over the nodes we recorded

    while (nr.iterate() != -1) {
        System.out.println("Re-found: " + vn.getCurrentIndex() + " " + 
                           vn.toRawString(vn.getCurrentIndex()));
    }

    System.out.println("Index after nr.iterate: " + 
                       vn.getCurrentIndex());

}

出力:

Found: 19 PartyName
Found: 20 Name
Found: 22 Name
Found: 24 Name
Index before nr.iterate: 19
Index after nr.iterate: -1

編集:ネストの少ない変更されたドキュメントを試したところ、これは機能します(partyNameXPathを "PartyName"だけに変更)。問題は深さに関連しているようです。

<?xml version="1.0" encoding="UTF-8"?>
<InlinePurchaseOrder>
     <PartyName>
        <Name>Bills Microdevices</Name>
        <Name>BM</Name>
        <Name>BMic</Name>
     </PartyName>
</InlinePurchaseOrder>

出力:

Found: 6 PartyName
Found: 7 Name
Found: 9 Name
Found: 11 Name
Index before nr.iterate: 6
Re-found: 7 Name
Re-found: 9 Name
Re-found: 11 Name
Index after nr.iterate: 11
4

1 に答える 1

1

これは修正されたばかりのバグです。報告していただきありがとうございます。CVSからNodeRecorder.javaをチェックアウトして、もう一度試していただけますか?

于 2013-02-21T03:53:31.463 に答える