VTD-XML Huge Data xPathExpression not working with namespace

I have a small test file when working with the namespace is huge. If I remove the namespace and work, am I doing something wrong with huge code?

Modified to remove broken code

    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();
    }

I get java.lang.IndexOutOfBoundsException for huge code and standard with NS

This is an example of XML, unfortunately, can not show real xml

<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>
+4
source share
1 answer

You get an exception due to several problems: some with your code, others with extended VTD-xml.

First, you do not include namespace awareness with the second part of the VTD code.

You also do not set the namespace binding correctly.

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

Thirdly, getText () returns -1, which throws an exception.

Finally, // the test will not match any node ... so getText () will certainly return -1.

0
source

Source: https://habr.com/ru/post/1686162/


All Articles