Convert text xml entities
Содержание |
Подготовка текста для вставки в XML документ
Замена служебных символов XML ссылками на их сущности
Задача
Для ручной вставки в XML-документ больших блоков текста необходимо заменить символы < > & " ' на ссылки на соответственные базовые XML сущности < > & " ', так как указанные пять символов внутри XML документа интерпретируются как элементы разметки и в данных появляться не должны (строго говоря недопустимо явное использование & и <, но хороший тон оформления XML документов требует замены всех пяти символов).
Реализация на C
Вот маленькая утилита, делающая необходимые замены из командной строки:
xmlent.c:
/*****************************************************************************
xmlent - converts text to xml-compliant format
by replacing restricted symbols with proper XML named character references
*****************************************************************************/
#include <stdio.h>
int main(int argc, char *argv[]) {
/* Print help */
if (argc > 1) {
printf("xmlent - converts text to xml-compliant format\n");
printf("by replacing restricted symbols with proper XML named character references\n");
printf("Usage:\n xmlent < textfile.txt > xmlcompliant.txt\n\n");
return 1;
}
/* Read stdin and write to stdout */
char c;
while ((c = getchar()) != EOF) {
if (c == '&') {
printf("&");
continue;
} else if (c == '<') {
printf("<");
continue;
} else if (c == '>') {
printf(">");
continue;
} else if (c == '\'') {
printf("'");
continue;
} else if (c == '\"') {
printf(""");
continue;
} else fputc(c, stdout);
}
return 0;
}
Сохраняем код в файл с именем xmlent.c.
Переходим в каталог с сохраненным файлом и компилируем:
$ make xmlent cc xmlent.c -o xmlent
Готово. Теперь проверяем:
$ echo "\" ' & < >" | ./xmlent " ' & < >
Соответственно для трансляции произвольного текста из файла sometext.txt в файл xmltext.txt выполняем:
$ ./xmlent < sometext.txt > xmltext.txt
или так:
$ cat sometext.txt | ./xmlent > xmltext.txt
Реализация на Perl
xmlent.pl:
#!/usr/bin/perl
# Substitute XML special chars
use strict;
my (@xml,$e,$n);
sub xmlent {
@xml = split //, $_[0];
for (my $n = 0; $n < @xml; $n++)
{
$e = $xml[$n];
if ($e =~ /\&/) { $xml[$n] = '&'; }
elsif ($e =~ /\'/) { $xml[$n] = '''; }
elsif ($e =~ /\"/) { $xml[$n] = '"'; }
elsif ($e =~ /\</) { $xml[$n] = '<'; }
elsif ($e =~ /\>/) { $xml[$n] = '>'; }
}
return join ('' , @xml);
}
print (xmlent ("< test & test \" test ' test >\n"));
Реализация на Shell+Sed
xmlent.sh:
#!/bin/sh # Convert restricted XML symbols to proper XML entities sed 's/\&/\&/g' | sed 's/</\</g' | sed 's/>/\>/g' | sed 's/\"/\"/g' | sed "s/'/\'/g"