Проанализируйте файл XML для смешанного содержимого, предполагая, что файл XSD / Schema недоступен - PullRequest
0 голосов
/ 30 октября 2019

Простой вопрос, но я не могу найти ответ где-нибудь ... Есть ли какой-либо существующий метод в perl (или, возможно, инструмент командной строки), чтобы проверить, содержит ли данный XML-файл смешанный контент?

Мне просто нужно что-то, что говорит мне, если смешанный контент присутствует, то нет. Хотя любые детали, если смешанный контент найден, будут бонусом. Если что-то существует, то обработка файла без полной его загрузки в память также будет лучше, поскольку файлы, которые мне нужно проанализировать, имеют размер 100 МБ и даже в некоторых случаях несколько ГБ. Если ничего не существует, я сам начну что-то писать.

Все вышесказанное предполагает, что файл XSD / Schema недоступен для данного файла XML.

1 Ответ

2 голосов
/ 31 октября 2019

Запрос XPath boolean(//*[text()[normalize-space()] and *]) возвращает значение true, если есть элемент, имеющий дочерние элементы как текстового, так и непробельного текста.

Для потокового алгоритма вам потребуется стек;на каждом уровне стека вы должны отслеживать, встречались ли на этом уровне непробельные дочерние элементы текста и / или дочерние элементы. Не так сложно добиться с помощью SAX-подобного API, хотя я не знаю, с чего начать в Perl.

С потоковой передачей XSLT 3.0 я думаю, что это можно сделать с помощью xsl: iterate:

<xsl:mode streamable="yes"/>
<xsl:template match="*">
  <xsl:iterate select="node()">
    <xsl:param name="found-element" select="false()"/>
    <xsl:param name="found-text" select="false()"/>
    <xsl:on-completion>
      <xsl:if test="$found-element and $found-text">
        <out>Found mixed content!!</out>
      </xsl:if>
    </xsl:on-completion>
    <xsl:apply-templates select="."/>
    <xsl:next-iteration>
      <xsl:with-param name="found-element" select="$found-element or self::*"/>
      <xsl:with-param name="found-text" select="$found-text or self::text()[normalize-space()]"/>
    </xsl:next-iteration>
  <xsl:iterate>
</xsl:template>

Есть много возможностей для улучшения этого;в настоящее время он будет давать вам много сообщений, если будет много смешанного контента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...