Avatar billede mercutio Nybegynder
25. juli 2008 - 10:56 Der er 6 kommentarer og
1 løsning

Saxparser fejl pga. invalid xml.

Hej Eksperter.

Jeg har lidt et problem. Jeg skal hive værdier ud af en masse xml filer og jeg har lavet en saxparser der skal gøre det. Det virker fint så længe xmllen er valid men denne xml driller.

<soap:body>
    <test xmlns="http://microsoft.com/webservices/">
        <id>9</id>
    </test>
</soap:body>

Problemet er når min saxparser forsøger at parse dokumentet brokker den sig over soap prefixet da det ikke er defineret.
[Fatal Error] :1:12: The prefix "soap" for element "soap:body" is not bound.

Jeg har ikke mulighed for at rette i xmllerne kan det lade sig gøre at få saxparseren til at ignorere fejln og fortsætte?

På forhånd tak.
Merc.
Avatar billede arne_v Ekspert
25. juli 2008 - 12:21 #1
Problemet er jo lidt at det er invalid XML. Fordi du hapser en SOAP body uden
at have SOAP envelope med.

Men hvis vi nu antager at du ikke kan ændre det.

Så mener jeg at du enten må disable namespace support eller fjerne de namespaces.

package july;

import java.io.IOException;
import java.io.StringReader;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;

public class SaxNS {
    public static void test(String xmlstr, boolean ns) throws SAXException, ParserConfigurationException, IOException {
        SAXParserFactory spf = SAXParserFactory.newInstance();
        spf.setNamespaceAware(ns);
        SAXParser sp = spf.newSAXParser();
        XMLReader xr = sp.getXMLReader();
        xr.setContentHandler(new MySaxParser());
        xr.parse(new InputSource(new StringReader(xmlstr)));
    }
    public static void main(String[] args) throws Exception{
        test("<outer><inner>bla bla</inner></outer>", true);
        test("<foobar:outer><inner>bla bla</inner></foobar:outer>", false);
        test("<foobar:outer><inner>bla bla</inner></foobar:outer>".replace("<foobar:", "<").replace("</foobar:", "</"), true);
    }
}

class MySaxParser extends DefaultHandler {
    private StringBuffer element = new StringBuffer();
    public void characters(char buf[], int offset, int len) throws SAXException {
      element.append(new String(buf, offset, len));
    }
    public void startElement(String namespaceURI, String localName, String rawName, Attributes atts) throws SAXException {
      element = new StringBuffer();
    }
    public void endElement(String namespaceURI, String localName, String rawName) throws SAXException {
        if(rawName.equals("inner")) {
            System.out.println(element);
        }
    }
}
Avatar billede mercutio Nybegynder
25. juli 2008 - 13:18 #2
Hej Arne.

Tak for det hurtige svar. Jeg sætter nu namespaceaware til false og i min startElement får jeg nu aldrig localname med ind så det sætter jeg selv med alt efter kolon fra qName. Så fungerer det perfekt og den fejler ikke selvom de der danner xmllen ikke får sat namespace rigtigt op.

Mvh. Merc.
Avatar billede arne_v Ekspert
25. juli 2008 - 15:05 #3
Jeg tror at den originale XML er korrekt. De har bare savet body delen ud af en
valid SOAP message og givet den til dig uden at faa defineret namespace i den
bid de giver dig.
Avatar billede arne_v Ekspert
25. juli 2008 - 15:12 #4
Proev og sammenlign din SOAP med dette eksempel far W3:

<?xml version='1.0' ?>
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope" >
<env:Header>
    <t:transaction
        xmlns:t="http://thirdparty.example.org/transaction"
          env:encodingStyle="http://example.com/encoding"
          env:mustUnderstand="true">5</t:transaction>
</env:Header> 
<env:Body>
    <m:chargeReservationResponse
        env:encodingStyle="http://www.w3.org/2003/05/soap-encoding"
            xmlns:m="http://travelcompany.example.org/">
      <m:code>FT35ZBQ</m:code>
      <m:viewAt>
        http://travelcompany.example.org/reservations?code=FT35ZBQ
      </m:viewAt>
    </m:chargeReservationResponse>
</env:Body>
</env:Envelope>

Hmm. body != Body
Avatar billede arne_v Ekspert
29. august 2008 - 02:34 #5
kommet videre ?
Avatar billede mercutio Nybegynder
29. august 2008 - 07:13 #6
Hej Arne.

Jep det virker nu pga. dit tidligere svar med at slå namespaceaawareness fra.

Så smid et svar så lukker vi den.

Merc.
Avatar billede arne_v Ekspert
29. august 2008 - 15:18 #7
ok
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester