2017-09-21 1 views
4

Ich habe eine kleine Testdatei bei der Ausführung mit großen Namespace fehlgeschlagen. Wenn ich Namespace beide Arbeit entferne, mache ich etwas mit Huge code falsch?VTD-XML Riesige Daten xPathExpression funktioniert nicht mit Namespace

Changed

try { 
     //without namespace works 
     VTDGen vtdGen = new VTDGen(); 
     vtdGen.parseFile("test.xml", false); 
     VTDNav vtdNav = vtdGen.getNav(); 
     AutoPilot autoPilot = new AutoPilot(vtdNav); 
     autoPilot.selectXPath("//Receiver/Identifier"); 
     autoPilot.evalXPath(); 
     System.out.println("Stand===>" + vtdNav.getXPathStringVal() + " ===>"); 
    } catch(IndexOutOfBoundsException e) { 
     e.printStackTrace(); 
    } 

    try { 
     //with namespace doesn't work 
     VTDGen vtdGen = new VTDGen(); 
     vtdGen.parseFile("test.xml", true); 
     VTDNav vtdNav = vtdGen.getNav(); 
     AutoPilot autoPilot = new AutoPilot(vtdNav); 
     autoPilot.declareXPathNameSpace("x", "http://test/namespaces/ssfgf"); 
     autoPilot.selectXPath("//x:Receiver/Identifier"); 
     int index = autoPilot.evalXPath(); 
     System.out.println("Stand NS ===>" + vtdNav.toString(index) + " ===>"); 
    } catch(IndexOutOfBoundsException e) { 
     e.printStackTrace(); 
    } 

    try { 
     //without namespace doesn't work 
     VTDGenHuge vg = new VTDGenHuge(); 
     vg.parseFile("test.xml", false); 
     VTDNavHuge vn = vg.getNav(); 
     AutoPilotHuge ap = new AutoPilotHuge(vn); 
     ap.selectXPath("//Receiver/Identifier"); 
     ap.evalXPath(); 
     System.out.println("Huge ===> " + vn.toString(vn.getText()) + " ===>"); 
    } catch(IndexOutOfBoundsException e) { 
     e.printStackTrace(); 
    } 

    try { 
     //with namespace doesn't work 
     VTDGenHuge vg = new VTDGenHuge(); 
     vg.parseFile("test.xml", true); 
     VTDNavHuge vn = vg.getNav(); 
     AutoPilotHuge ap = new AutoPilotHuge(vn); 
     ap.declareXPathNameSpace("x", "http://test/namespaces/ssfgf"); 
     ap.selectXPath("//Receiver/Identifier"); 
     ap.evalXPath(); 
     System.out.println("Huge NS ===> " + vn.toString(vn.getText()) + " ===>"); 
    } catch(IndexOutOfBoundsException e) { 
     e.printStackTrace(); 
    } 

undurchführbar Code I java.lang.IndexOutOfBoundsException mit NS leider nicht real xml

zeigen Dies ist eine XML-Beispiel

für beide Huge Code und Standard erhalten zu entfernen

<x:TestDocument xmlns:x="http://test/namespaces/ssfgf" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://test/namespaces/ssfgf"> 
    <x:TestHeader> 
     <x:Type></x:Type> 
     <x:Scopes> 
      <x:Scope> 
       <x:Identifier>Context</x:Identifier> 
       <x:Type>CaseId</x:Type> 
       <x:InstanceIdentifier>case1</x:InstanceIdentifier> 
       <x:Business> 
        <x:Name>businessnane1</x:Name> 
       </x:Business> 
      </x:Scope> 
      <x:Scope> 
       <x:Identifier>Context</x:Identifier> 
       <x:InstanceIdentifier>test1</x:InstanceIdentifier> 
       <x:Type>TestId</x:Type> 
      </x:Scope> 
      <x:Scope> 
       <x:Identifier>Context</x:Identifier> 
       <x:InstanceIdentifier>other1</x:InstanceIdentifier> 
       <x:Type>OtherId</x:Type> 
      </x:Scope> 
     </x:Scopes> 
     <x:Receiver> 
      <x:Identifier>testreceiverid</x:Identifier> 
     </x:Receiver> 
     <x:DocumentIdentification> 
      <x:Type>type1</x:Type> 
      <x:Identifier>id1</x:Identifier> 
      <x:TypeVersion>version1</x:TypeVersion> 
     </x:DocumentIdentification> 
    </x:TestHeader> 
    <x:TestBody attribute1="attribute1" attribute2="attribute2"> 
     <TestingData>testingdata1</TestingData> 
    </x:TestBody> 
</x:TestDocument> 
+0

// x: Empfänger/Bezeichner sollte // sein x: Empfänger/x: Bezeichner ... –

+0

Prost das hat funktioniert. Eine letzte Frage, wie bekomme ich ein XML-Fragment in der Standard-Version Ich könnte folgendes tun long l = vtdNavStandard.getContentFragment(); System.out.println (vtdNavStandard.toString ((int) l, (int) (l >> 32))); Ich bemerke, dass vtdNavHuge.getContentFragment() gibt long [] und das toString (int, int) ist nicht verfügbar in der großen Version – Pete

+0

es ist nicht verfügbar, aber möglicherweise bald verfügbar ... –

Antwort

0

Sie erhalten die Ausnahme wegen einiger Probleme: einige mit Ihrem Code, andere mit erweiterten VTD-xml.

Zuerst schalten Sie die Namespace-Awareness nicht mit dem zweiten Codeteil von VTD ein.

Sie setzen auch nicht den Namespace rechts Bindung ..

ap.declareXPathNameSpace("x", "http://test/namespaces/ssfgf"); 

Drittens getText() gibt eine -1, der die Ausnahme verursacht.

Schließlich, // Test wird keinem Knoten entsprechen ... also würde getText() sicherlich -1 zurückgeben.

+0

Geänderter Code oben, um zu arbeiten. – Pete