2010-07-22 25 views
1

Je suis en train d'échapper à des caractères HTML d'une chaîne et cette chaîne pour construire un DOM XML en utilisant la méthode parseXML ci-dessous. Ensuite, j'essaie d'insérer ce document DOM dans la base de données. Mais, quand je fais ce que je reçois l'erreur suivante:org.xml.sax.SAXParseException: Référence est interdite dans Prolog

org.xml.sax.SAXParseException: Référence est interdite dans Prolog.

J'ai trois questions: 1) Je ne sais pas comment échapper des guillemets doubles. J'ai essayé replaceAll ("\" "," " ") et je ne sais pas si c'est juste

2) Supposons que je veux une chaîne commençant et se terminant par des guillemets doubles (par exemple:" sony "), comment puis-je ? Code, j'essayé quelque chose comme:

chaîne sony = « \ » sony \ « »?

est-ce droit la chaîne ci-dessus contiennent « sony » avec des guillemets doubles ou est-il une autre façon de le faire ?

3) Je ne suis pas sûr de ce que l'erreur "org.xml.sax.SAXParseException: Reference is not allowed in prolog." Signifie que quelqu'un peut m'aider à résoudre ce problème?

Merci, Sony

étapes dans mon code:

  1. Utils. java

    escapeHtmlEntities à cordes statiques publics (String) { retour s.replaceAll ("&", "& ") .ReplaceAll (" <", "< ") .ReplaceAll (">", ">") . .ReplaceAll ("\" " "" ") replaceAll (":", ": ") .ReplaceAll (" /"," / «);}

    public static Document parseXml (String xml) throws Exception { 
    
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
        factory.setNamespaceAware(true); 
        DocumentBuilder builder = factory.newDocumentBuilder(); 
        Document doc = builder.parse(new InputSource(new StringReader(xml))); 
        doc.setXmlStandalone(false); 
        return doc; 
    } 
    
  2. TreeController.java

    notifyNewEntryCreated protégé vide (String EntryType) renvoie Exception { pour (Listener l: treeControlListeners) l.newEntryCreated();

    final DomNodeTreeModel domModel = (DomNodeTreeModel) getModel(); 
    Element parent_item = getSelectedEntry(); 
    String xml = Utils.escapeHtmlEntities("<entry xmlns=" + "\"http://www.w3.org/2005/atom\"" + "xmlns:libx=" + 
         "\"http://libx.org/xml/libx2\">" + "<title>" + "New" + entryType + "</title>" + 
         "<updated>2010-71-22T11:08:43z</updated>" + "<author> <name>LibX Team</name>" + 
          "<uri>http://libx.org</uri>" + "<email>[email protected]</email></author>" + 
          "<libx:" + entryType + "></libx:" + entryType + ">" + "</entry>"); 
    xmlModel.insertNewEntry(xml, getSelectedId()); 
    

    }

  3. XMLDataModel.java

insertNewEntry public void (String xml, String id_parent) throws Exception { insertNewEntry (Utils.parseXml (xml) .getDocumentElement(), parent_id); }

public void insertNewEntry (Element elem, String parent_id) throws Exception { 

    // inserting an entry with no libx: tag will create a storage leak 
    if (elem.getElementsByTagName("libx:package").getLength() + 
     elem.getElementsByTagName("libx:libapp").getLength() + 
     elem.getElementsByTagName("libx:module").getLength() < 1) { 
     // TODO: throw exception here instead of return 
     return; 
    } 

    XQPreparedExpression xqp = Q.get("insert_new_entry.xq"); 
    xqp.bindNode(new QName("entry"), elem.getOwnerDocument(), null); 
    xqp.bindString(new QName("parent_id"), parent_id, null); 
    xqp.executeQuery(); 
    xqp.close(); 

    updateRoots(); 
} 
  1. insert_new_entry.XQ

espace de noms libx = déclarer 'http://libx.org/xml/libx2'; declare namespace atom = 'http://www.w3.org/2005/atom'; déclare la variable $ entry en tant que xs: anyAtomicType external; déclare la variable $ parent_id en tant que xs: string external; déclare la variable $ feed en tant que xs: anyAtomicType: = doc ('libx2_feed')/atom: feed; déclare la variable $ metadata en tant que xs: anyAtomicType: = doc ('libx2_meta')/metadata; laisser curid $: = métadonnées $/curid retour remplacer la valeur de nœud curid de $ avec des données (curid $) + 1, laisser newid $: = données (métadonnées $/curid) + 1 insert retour noeud {$ newid} { entrée $// } dans l'alimentation $, nous newid $: = données (métadonnées $/curid) + 1 retour si ($ parent_id = 'root') puis() autre insérer le noeud http://libx.org/xml/libx2 '/> dans $ feed/atom: entrée [atom: id = $ parent_id] // (libx: module | libx: libapp | libx: package)

+0

Salut, J'ai appris que l'erreur: "org.xml.sax.SAXParseException: référence n'est pas autorisée dans prolog." est levée lorsque XML en cours de chargement n'a pas de code XML valide. Ainsi, tout le problème se résume à la conversion de la chaîne en XML valide. Donc je suppose que la question se résume à la conversion de la chaîne « xml » utilisé dans l'exemple ci-dessus dans un xml valide. Je devine que quelque chose ne va pas dans la façon dont je m'échappe et j'utilise des caractères guillemets html. Je suis toujours confus avec les questions 1 et 2 dans le post ci-dessus. Merci pour l'aide. -Sony – sony

Répondre

0

Pour éviter une double citation, utilisez l'entité &quot;, qui est prédéfinie en XML.

Ainsi, votre chaîne d'exemple, supposons que une valeur d'attribut, ressemblera

<person name="&quot;sony&quot;"/> 

Il y a aussi &apos; pour apostrophes/guillemet simple.

Je vois que vous avez beaucoup d'appels replaceAll, mais les remplacements semblent être les mêmes? Il y a quelques autres caractères qui ne peuvent pas être utilisés littéralement, mais ils doivent être échappés:

& --> &amp; 
    > --> &gt; 
    < --> &lt; 
    " --> &quot; 
    ' --> &apos; 

(EDIT: ok, je vois cela est juste formatage - les entités sont transformées en ils sont des valeurs réelles présenté par SO.)

l'exception SAX est l'analyseur grogne à cause du XML non valide.

En plus échapper le texte, vous devez vous assurer qu'il adhère à la well-formedness rules de XML. Il y a pas mal de choses à faire, donc il est souvent plus simple d'utiliser une bibliothèque tierce pour écrire le XML. Par exemple, XMLWriter dans dom4j.

0

Vous pouvez consulter la spécification Tidy. C'est une spécification publiée par W3C. Presque toutes les langues récentes ont leur propre implémentation. Plutôt que de simplement remplacer <, , il suffit de configurer les options JTidy (pour Java) et d'analyser. cela résume toute la complication de la chose d'échappement Xml.

je l'ai utilisé à la fois python, java et MarkLogic base implémentations bien rangé. tous résolu mes fins