Замените зарезервированные символы в XML на escape-строки - PullRequest
0 голосов
/ 23 января 2019

У меня есть XML-файлы, которые содержат символы <, >, &.Например:

<?xml version="1.0" encoding="utf-8"?>
<test>
  <medi>bla bla >12 bla</medi>
  <diag>bla & bla <12</diag>
</test>

Эти символы зарезервированы для нотации XML и должны быть заменены экранирующими строками &lt;, &gt;, &amp;.Это относится также к кавычкам ("-> &quot;) и апострофам ('-> &apos;).

Вот что мне нравится получать:

<?xml version="1.0" encoding="utf-8"?>
<test>
  <medi>bla bla &gt;12 bla</medi>
  <diag>bla &amp; bla &lt;12</diag>
</test>

Обычно яиспользуйте регулярные выражения с perl или sed. Но, искренне, у меня ничего не получилось. Сложность состоит в том, чтобы избежать замены соответствующих XML-символов, таких как < и > и & escape-строк.

Чтобы сделатьэто ясно, что я имею в виду, я поставил решение с Perl, который не работает:

use strict;
use warnings;

my $input  = $ARGV[0];
my $output = $ARGV[1];

open INPUT,  $input or die "Couldn't open file $input, $!";
open OUTPUT, ">$output" or die "Couldn't open file $output, $!";

my $rec;

while (<INPUT>) {

    $rec = $_;
    print $rec;

    $rec =~ s/(<medi>.*)<(.*<\/medi>)/$1&lt;$2/g;    
    $rec =~ s/(<medi>.*)>(.*<\/medi>)/$1&gt;$2/g;    
    $rec =~ s/(<medi>.*)&(.*<\/medi>)/$1&amp;$2/g;
    $rec =~ s/(<medi>.*)'(.*<\/medi>)/$1&apos;$2/g;
    $rec =~ s/(<medi>.*)"(.*<\/medi>)/$1&quot;$2/g;

    $rec =~ s/(<diag>.*)<(.*<\/diag>)/$1&lt;$2/g;    
    $rec =~ s/(<diag>.*)>(.*<\/diag>)/$1&gt;$2/g;    
    $rec =~ s/(<diag>.*)&(.*<\/diag>)/$1&amp;$2/g;
    $rec =~ s/(<diag>.*)'(.*<\/diag>)/$1&apos;$2/g;
    $rec =~ s/(<diag>.*)"(.*<\/diag>)/$1&quot;$2/g;

    print $rec;
    print OUTPUT $rec;
}
close INPUT;
close OUTPUT;

Это дает мне:

<?xml version="1.0" encoding="utf-8"?>
<test>
  <medi>bla bla &amp;gt;12 bla</medi>
  <diag>bla & bla &amp;lt;12</diag>
</test>

Что происходит:

  • Амперсанд &gt; был заменен на &amp;, который не предназначен
  • Амперсанд на <diag> bla & bla ... не заменен

Я уверен, что есть регулярное выражение, которое может решитьэта проблема. Но если есть совершенно другой способ сделать xml правильно сформированным, я открыт для этого.

Ответы [ 2 ]

0 голосов
/ 09 апреля 2019

если ваши данные в 'd', от gnu sed

sed -E 's/&/&amp\;/g;s/</&lt\;/g;s/>/&gt\;/g;s/\x27/&apos\;/g;/xml ver/!s/\"/&quot\;/g' d

или "is \ x22
если ты так уверишь

0 голосов
/ 23 января 2019

Если у вас есть файлы, содержащие такие символы, как '<', '>' и '&' в текстовых узлах, то у вас нет файлов XML.

Чтобы это исправить, вам нужно проанализировать файлы с помощью анализатора XML. Но вполне вероятно, что большинство анализаторов XML откажутся анализировать эти файлы, поскольку они не являются правильно сформированным XML. Возможно, что-то вроде XML :: Lenient может быть полезным здесь.

Правильный подход - вернуться к источнику этих файлов и исправить этот процесс, чтобы он генерировал правильно сформированные XML-файлы. Если вы создаете файлы, вам нужно исправить код, который их создает. Если кто-то предоставляет вам файлы, вам нужно вернуться к ним и попросить предоставить действительные файлы XML.

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