У меня есть ситуация, в которой документ XML содержит информацию различной глубины (в соответствии со схемами S1000D), и я ищу обобщенный c метод для извлечения правильных предложений.
I Мне нужно интерпретировать простой элемент, содержащий текст, как одну отдельную часть / предложение, и когда элемент, содержащий текст, содержит другие элементы, которые, в свою очередь, содержат текст, мне нужно сгладить / объединить его в одну строку / предложение. Если это будет сделано, вложенные элементы не будут посещаться снова.
Использование библиотеки Pythons lxml
и применение функции tostring
работает нормально, если исходный текст XML напечатан довольно красиво, так что я могу разбить объединенная строка в новые строки, чтобы получить каждое предложение. Если исходный текст не напечатан, в одной строке не будет никаких новых строк для разделения.
Я пробовал функцию iter и применял xpaths
к каждому узлу, но это часто дает Python другие результаты, отличные от того, что я получаю при применении xpath
в XMLSpy
.
Я начал с некоторых из следующих путей, и мой вопрос заключается в том, есть ли у вас какие-то данные, по которым для продолжения, или если у вас есть другие решения.
Я думаю, что я мог бы использовать XSLT для предварительной обработки файла XML, а затем использовать более простой сценарий Python, чтобы разделить содержимое на список предложений. для дальнейшей обработки. Использование Saxon с Python теперь выполнимо, но здесь я сталкиваюсь с проблемами, если источник XML содержит объекты, которые я не могу перенаправить для разрешения Saxon (например, & nbsp;). У меня нет проблем с парсингом файлов с lxml
, поэтому я склоняюсь к более чистому Python решению.
lxml
, похоже, не имеет поддержки xpath
, которая может дать мне все узлы с текст, который содержит одного или нескольких дочерних элементов, содержащих текст, и все узлы, которые являются простыми элементами без родительских элементов, содержащих текстовые узлы. Есть ли способ предварительной обработки проанализированного дерева, чтобы я мог убедиться, что оно довольно распечатано в памяти, чтобы tostring
работал одинаково для каждого файла XML? В противном случае, моя логика c дает мне одну строку для документа без пробелов и несколько предложений / строк, если источник был напечатан. Это не очень хорошо.
Какие у меня варианты? Используйте XSLT 1.0
в Python, другие парсеры, чтобы лучше понять, где я нахожусь в дереве, ...
Просто чтобы повторить эту проблему здесь; Я ищу общий c способ извлечения текста, и единственные правила для источника XML состоят в том, что предложение может быть построено из элемента с дочерними элементами с текстом, но дополнительных уровней не будет. Другая возможность - простой элемент, но его нельзя включить в родительский элемент с текстом, поскольку он включен в первое правило.
Помощь / мысли приветствуются.