org.xml.sax.SAXParseException: ссылка не допускается в прологе - PullRequest
2 голосов
/ 22 июля 2010

Я пытаюсь экранировать html-символы строки и использую эту строку для построения XML DOM с использованием метода parseXml, показанного ниже.Далее я пытаюсь вставить этот документ DOM в базу данных.Но когда я это делаю, я получаю следующую ошибку:

org.xml.sax.SAXParseException: Ссылка в прологе недопустима.

У меня есть три вопроса: 1) Я неуверен, как избежать двойных кавычек.Я пробовал replaceAll ("\" "," "") и не уверен, правильно ли это.

2) Предположим, я хочу, чтобы строка начиналась и заканчивалась двойными кавычками (например, "sony"), какмне кодировать это?Я пробовал что-то вроде:

String sony = "\" sony \ ""

Это правильно?Будет ли приведенная выше строка содержать «sony» вместе с двойными кавычками, или есть ли другой способ сделать это?

3) Я не уверен, что «org.xml.sax.SAXParseException: ссылка не допускается в прологе«.ошибка означает.Может кто-нибудь помочь мне исправить это?

Спасибо, Sony

Шаги в моем коде:

  1. Утилиты.java

    открытая статическая строка escapeHtmlEntities (String s) {return s.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

    protected void notifyNewEntryCreated (String entryType) выдает исключение {для (слушатель 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>libx.org@gmail.com</email></author>" + 
                "<libx:" + entryType + "></libx:" + entryType + ">" + "</entry>");
    xmlModel.insertNewEntry(xml, getSelectedId());
    

    }

  3. XMLDataModel.java

public void insertNewEntry (String xml, String parent_id) вызывает исключение {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();
}
insert_new_entry.xq

объявить пространство имен libx = 'http://libx.org/xml/libx2'; объявить атом пространства имен =' http://www.w3.org/2005/atom'; объявить переменную $ entry в виде xs: anyAtomicType external;объявите переменную $ parent_id как xs: string external;объявите переменную $ feed как xs: anyAtomicType: = doc ('libx2_feed') / atom: feed;объявите переменную $ metadata как xs: anyAtomicType: = doc ('libx2_meta') / metadata;let $ curid: = $ metadata / curid возвращает замену значения узла $ curid данными ($ curid) + 1, let $ newid: = data ($ metadata / curid) + 1 возвращает узел вставки {$ newid} {$ entry / / } в $ feed, пусть $ newid: = data ($ metadata / curid) + 1 возвращает if ($ parent_id = 'root') then (), в противном случае вставьте узел http://libx.org/xml/libx2' /> в $ feed/ атом: запись [атом: ID = $ parent_id] // (libx: модуль | libx: libapp | libx: пакет)

Ответы [ 2 ]

0 голосов
/ 30 июля 2010

Вы можете проверить спецификацию Tidy.это спецификация, выпущенная w3c.Почти все последние языки имеют свою реализацию.

, а не просто заменять или заботиться только о <,>, а просто настраивать параметры JTidy (для java) и анализировать.это абстрагирует от всех сложностей, связанных с выходом из XML.

Я использовал как аккуратные реализации на python, java, так и на marklogic.все мои цели решены

0 голосов
/ 23 июля 2010

Чтобы избежать двойной кавычки, используйте сущность &quot;, которая предопределена в XML.

Итак, ваш пример строки, скажем, значение атрибута, будет выглядеть как

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

Существует также &apos; для апострофа / одинарной кавычки.

Я вижу, у вас много вызовов replaceAll, но кажется, что замены такие же? Есть некоторые другие символы, которые не могут использоваться буквально, но должны быть экранированы:

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

(РЕДАКТИРОВАТЬ: хорошо, я вижу, что это просто форматирование - сущности превращаются в их действительные значения при представлении SO.)

Исключением SAX является ворчание синтаксического анализатора из-за неверного XML.

Помимо экранирования текста, вам необходимо убедиться, что он соответствует правилам правильной формы XML. Есть много, чтобы понять, так что часто проще использовать стороннюю библиотеку для записи XML. Например, XMLWriter в dom4j .

...