org.xml.sax.SAXParseException mentre il parsing di XMl utilizzando XPATH

Sto cercando di ottenere i valori da un file XML utilizzando XPATH. Ho ricevuto la seguente eccezione:

    [Fatal Error] books.xml:4:16: The prefix "abc" for element "abc:priority" is not bound.
Exception in thread "main" org.xml.sax.SAXParseException; systemId: file:///D:/XSL%20TEST%20APP%20BACK%20UP/XMLTestApp/books.xml; lineNumber: 4; columnNumber: 16; The prefix "abc" for element "abc:priority" is not bound.
    at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(Unknown Source)
    at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(Unknown Source)
    at javax.xml.parsers.DocumentBuilder.parse(Unknown Source)
    at xpath.XPathExample.main(XPathExample.java:18)

Ricevo questo errore perché il mio XML è un po ‘ diverso da uno normale (vedere di seguito):

<?xml version="1.0" encoding="UTF-8"?>
<inventory>
    <Sample>
    <abc:priority>1</abc:priority>  
    <abc:value>2</abc:value>        
    </Sample>
</inventory>

Qui è il mio codice (Java) per ottenere i valori sopra XML:

import java.io.IOException;
    import org.w3c.dom.*;
    import org.xml.sax.SAXException;
    import javax.xml.parsers.*;
    import javax.xml.xpath.*;

    public class XPathExample {

      public static void main(String[] args) 
       throws ParserConfigurationException, SAXException, 
              IOException, XPathExpressionException {

        DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
        domFactory.setNamespaceAware(true); //never forget this!
        DocumentBuilder builder = domFactory.newDocumentBuilder();
        Document doc = builder.parse("books.xml");

        XPathFactory factory = XPathFactory.newInstance();
        XPath xpath = factory.newXPath();
        XPathExpression expr 
         = xpath.compile("//Sample/*/text()");////book/Sample[author='Neal Stephenson']/title/text()

        Object result = expr.evaluate(doc, XPathConstants.NODESET);
        NodeList nodes = (NodeList) result;
        for (int i = 0; i < nodes.getLength(); i++) {
            System.out.println(nodes.item(i).getNodeValue()); 
        }

      }

    }

Se mi togli il punto e virgola, non ho mai ottenere questo errore.

È possibile ottenere il contenuto da un file XML come detto sopra, utilizzando XPATH?

 

2 Replies
  1. 2

    È possibile ottenere il contenuto da un file XML come detto sopra, utilizzando Xpath ?” – Io non la penso così. Questo XML non è ben formato.

    Dalla spec (http://www.w3.org/TR/REC-xml-names/#ns-qualnames):

    Il Prefisso fornisce il prefisso del namespace parte del nome completo,
    e DEVE essere associato con un URI dello spazio dei nomi di riferimento in uno spazio dei nomi
    dichiarazione. [Definizione: La parte locale fornisce la parte locale del
    il nome completo.]

    Per fare qualsiasi cosa con esso, penso che dovrete aggiungere una dichiarazione dello spazio dei nomi.

    Esempio

    <inventory xmlns:abc="x">
        <Sample>
            <abc:priority>1</abc:priority>  
            <abc:value>2</abc:value>        
        </Sample>
    </inventory>
    • Sono sempre i valori indicati il metodo di utilizzo di //Esempio/*/text(). Ma ho fatto niente di //Campione/abc:priorità/text() si prega di consulenza.
    • Perché il prefisso abc non è vincolato. Se //Sample/*/text() funziona, si può provare a utilizzare *[local-name()='priority'] invece di * solo.
    • Sono sempre il valore null durante l’utilizzo *[locale-name()=’priorità’]. in realtà ho voglia di leggere un webservice sembrerà come segue
    • <?xml version=”1.0″ encoding=”UTF-8″?> <abc:Evento abc1:type=”abc:Evento” xmlns:abc=”schema.abc.com/abc” xmlns:abc1=”w3.org/2001/XMLSchema-instance“> <abc:eventID>65c81c27-c79e-ce-9e4b-1d6c36f2f30c</abc:eventID> <abc:sequenceNumber>1</abc:sequenceNumber> <abc:userId>esempio</abc:userId> <abc:externalApplicationId>SampleApp</abc:externalApplicationId> <abc:subscriptionId>1e318cb7-84f2-40c6 </abc:subscriptionId> <abc:channelId>714353f-4313-4f5f-aa61-b912c7</abc:channelId> <abc:eventData abc1:type=”abc:NewSubscriptionEvent” /> </abc:Evento> Scusa per il ritardo della risposta.
    • Posso ottenere l’id utente utilizzando Xpath? Se è così, si prega di consulenza. Thnks
    • grazie, io ho avuto la risposta. //*[locale-name()=’userId’]/text()
    • Mi potete dire il xpath di ottenere attributo del tag <abc:eventData abc1:type=”abc:NewSubscriptionEvent” />.
    • È possibile utilizzare local-name() su @* come questo: //*[local-name()='eventData']/@*[local-name()='type']
    • Ho capito, vi Ringrazio molto

  2. 1

    Provare senza linea:

        domFactory.setNamespaceAware(true); //never forget this!

    Anche se normalmente è una cattiva idea per eseguire senza spazio dei nomi consapevolezza, in questo caso specifico non ha senso, dal momento che il file di input è il modo in cui è.

Lascia un commento