Как заставить SAXParser игнорировать escape-коды - PullRequest
2 голосов
/ 07 января 2012

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

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

Ответы [ 4 ]

1 голос
/ 08 января 2012

Есть что-то подозрительное в том, что вы пытаетесь сделать.

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

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

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


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

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

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

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

0 голосов
/ 02 мая 2016

Я анализирую приведенную ниже строку, используя 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);
0 голосов
/ 08 января 2012

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

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

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

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

0 голосов
/ 07 января 2012

Возможно, это не лучшее общее решение для 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
    }
}
...