Вопрос по saxparser, java, html-escape-characters – Как заставить SAXParser игнорировать escape-коды

2

Я пишу Java-программу для чтения и XML-файл, на самом деле это библиотека iTunes, которая имеет формат XML plist. Мне удалось обойти большинство препятствий, которые создает этот формат, за исключением случаев, когда встречается текст, содержащий&, Файл XLM представляет этот амперсанд как& и я могу только прочитать текст после& в любом конкретном разделе текста.

Есть ли способ отключить обнаружение escape-кодов? Я использую SAXParser.

Ваш Ответ

4   ответа
1

Если формат файла, который вы пытаетесь проанализировать, содержит пустой амперсанд (&) персонажи то естьне правильно сформированный XML. Амперсанды представлены как символьные объекты (например,&) в правильно сформированном XML.

Если предполагается, что это настоящий XML, то существует ошибка в том, что записало / сгенерировало файл.

Если предполагается, что это не настоящий XML (то есть эти амперсанды не являются ошибкой), то, вероятно, не стоит пытаться анализировать его с помощью анализатора XML.

Ах я вижу. XML на самом деле правильно закодирован, но вы не правильно разметили SO.

Казалось бы, ваша настоящая проблема в том, что вашcharacters(...) обратный вызов вызывается отдельно для текста перед&для (расшифрованный)&и, наконец, для текста после&, Вы просто должны иметь дело с этим, соединяя фрагменты текста обратно вместе.

Javadoc дляContentHandler.characters() говорит это:

«Парсер будет вызывать этот метод, чтобы сообщать о каждом фрагменте символьных данных. SAX-анализаторы могут возвращать все смежные символьные данные в одном фрагменте, или они могут разделить его на несколько фрагментов ...».

Файл XLM представлен в формате XML для Apple, а символ & представлен как & # 38; Извините, я забыл упомянуть об этом в своем сообщении! Scott
0

так, для меня это звучит как ошибка в iTunes, из-за которой забыли правильно закодировать амперсанд. Я не удивлюсь: они явно не получили XML в первую очередь, их схема<name>[key]</name><string>[value]</string> должен заставить рвать изобретателей XML.

Возможно, вы захотите использовать другой, более надежный парсер. SAX великолепен, пока файл правильно сформирован. Однако я не знаю, насколько надежны dom4j и jdom. Просто дай им попробовать. Для питона я знаю, что рекомендуюElementTree или жеBeautifulSoup которые очень крепкие

Также посмотрите наhttp://code.google.com/p/xmlwise/ который я нашелупоминается здесь в stackoverflow (Вы использовали поиск?).

Обновить: (согласно обновленному вопросу) Вынужно понять роль сущностей в XML и, следовательно, SAX. Они по умолчанию отдельные узлы, как текстовые узлы. Поэтому вам, вероятно, потребуется объединить их с соседними текстовыми узлами, чтобы получить полное значение. Используете ли вы DTD в вашем парсере? Использование правильного DTD - с определениями сущностей - может помочь в анализе, так как оно может содержать сопоставления от сущностей, таких как&amp; персонажам, которых они представляют&и синтаксический анализатор может выполнить объединение за вас. (По крайней мере, синтаксический анализатор Python XML-pull, который мне нравится использовать для больших файлов, делает это при материализации поддеревьев.)

0

это не лучшее общее решение для escape-символов, но мне нужно было только учитывать новые строки, чтобы было легко проверить \ n.

Вы можете проверить обратную косую черту \ только для проверки всех escape-символов или в вашем случае &, хотя я думаю, что другие придут с более элегантными решениями.

@Override
public void characters(char[] ch, int start, int length) 
{
    String elementData = new String(ch, start, length);
    boolean elementDataContainsNewLine = (elementData.indexOf("\n") != -1);

    if (!elementDataContainsNewLine) 
    {
        //do what you want if it is no new line
    }
}
-1

Я анализирую приведенную ниже строку, используя SAXParser

<xml>
<FirstTag>&amp;&lt;</FirstTag>
<SecondTag>test</SecondTag>
</xml>
I want the same string to be retained but it is getting converted to below
<xml>
<FirstTag>&<</FirstTag>
<SecondTag>test</SecondTag>
<xml>
Here is my code. How can I avoid this being converted?
SAXParserFactory factory = SAXParserFactory.newInstance();
        SAXParser saxParser = factory.newSAXParser();
        MyHandler handler = new MyHandler();  
        values = handler.getValues();
        saxParser.parse(x, handler);

Похожие вопросы