Синтаксический анализ XML из не-XML документа - PullRequest
2 голосов
/ 01 января 2011

в файле xml / non-xml может существовать какой-то блок XML, который мне нужно проанализировать и заменить другой строкой .. Сценарий выглядит примерно так:

Some Text
<cnt:use name="abc" call="xyz">
   <cnt:param name="x" value="2" />
</cnt:use>
Some Text

Нетгарантировать, что документ является надлежащим XML-документом.(могут существовать некоторые незакрытые теги. или некоторые другие распространенные ошибки, которые могут делать глупые люди, набирая HTML).поэтому я не могу использовать SAX или DOM.Я даже не могу передать его в XSLT (я прав?).Так что же является лучшим способом извлечь часть <cnt:*> из не-XML документа.и прочитайте его, а затем замените чем-нибудь другим.

Ответы [ 4 ]

2 голосов
/ 01 января 2011

Я даже не могу передать его в XSLT верно?).

правый. XSLT работает с XML Infoset , который является представлением анализируемого дерева (документ XML). И этот текст, в общем, не разбирается как XML.

В XSLT 2.0 есть функция parse-text(), которая может читать любой текст, но этот текст должен быть проанализирован, и до появления XSLT 3.0 не будет функций, которые даже смутно напоминают такой анализ - и когда они есть, они потерпят неудачу, потому что текст не является правильно сформированным XML.

Вся проблема извлечения фрагментов XML из некорректно сформированного XML является неоднозначной и не вполне определенной . Например, если отсутствует конечный тег, как вы решаете, куда именно его вставить?

1 голос
/ 02 января 2011

Хм. Проблема в том, что я должен реализовать это на PHP :(. Супер Сад .. Итак, взяв идеи из TagSoup, как упомянуто в ответе Мадс Хансен. Я сделал Mini SAX Framework на PHP 5.3. https://github.com/neel/SuSAX/blob/master/sax.php.

Я держу это больше как SAX. в то же время я отслеживаю и вложенность тегов. а также сохраняя дерево разбора. Я сохранил метод setNsFocus(), который указывает только те теги, которым нужно следовать.

<?php
error_reporting(255);
ini_set('display_errors','On');
header('Content-Type: text/plain');
class MyParser extends \SuSAX\AbstractParser{
    public function open($tag){
        echo ">> open ".$tag->ns().':'.$tag->name().'/'.$this->indentation().($this->parent() ? $this->parent()->name() : '')."\n";
        return "OO";
    }
    public function close($tag){
        echo ">> close ".$tag->ns().':'.$tag->name().'/'.$this->indentation()."\n";
    }
    public function standalone($tag){
        echo ">> standalone ".$tag->ns().':'.$tag->name().'/'.$this->indentation()."\n";
    }
    }
$text = <<<TEXT
Hallo <b>W<html:i>o</html:i>rld</b>
<cnt:tag x="2" y="1">
<cnt:taga x="2" y="1"></cnt:taga>
</cnt:tag>
I am Here
TEXT;
$parser = new \SuSAX\Parser(new MyParser);
$parser->setNsFocus('cnt');
$parser->setText($text);
$text_ = $parser->parse();
var_dump($text_);
?>
0 голосов
/ 02 января 2011

На самом деле, вы можете попробовать использовать DOM::loadHTML, так как этот метод допускает некорректную разметку.

http://php.net/domdocument.loadhtml

0 голосов
/ 01 января 2011

alt text TagSoup - Просто продолжайте вождения alt text

Вы можете использовать TagSoup , чтобы убедиться, что все документы правильно сформированы.

... SAX-совместимый синтаксический анализатор, написанный на Java что вместо разбора правильно сформированного или действительный XML, анализирует HTML как есть в дикой природе: бедные, противные и жестокий, хотя довольно часто далеко от короткая.

TagSoup предназначен для людей кто должен обрабатывать эти вещи, используя некоторое подобие рационального дизайн приложения.

Предоставляя SAX интерфейс, он позволяет стандартный XML инструменты, применяемые даже к худшему HTML. TagSoup также включает в себя процессор командной строки, который читает HTML файлы и могут генерировать либо чистые HTML или правильно сформированный XML, который является близкое приближение к XHTML.

Если вы используете Saxon, вы можете сделать TagSoup вашим парсером, добавив следующую опцию :

... вы можете использовать стандартную опцию Saxon -x org.ccil.cowan.tagsoup.Parser, убедившись, что TagSoup включен ваш путь к классам Java.

Также, Taggle, TagSoup в C ++, доступен сейчас

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