Convert text xml entities

Материал из KLUG
Перейти к: навигация, поиск

Содержание

Подготовка текста для вставки в XML документ

Замена служебных символов XML ссылками на их сущности

Задача

Для ручной вставки в XML-документ больших блоков текста необходимо заменить символы < > & " ' на ссылки на соответственные базовые XML сущности &lt; &gt; &amp; &quot; &apos;, так как указанные пять символов внутри 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
&quot; &apos; &amp; &lt; &gt;

Соответственно для трансляции произвольного текста из файла 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] = '&amp;'; }
       elsif ($e =~ /\'/) { $xml[$n] = '&apos;'; }
       elsif ($e =~ /\"/) { $xml[$n] = '&quot;'; }
       elsif ($e =~ /\</) { $xml[$n] = '&lt;'; }
       elsif ($e =~ /\>/) { $xml[$n] = '&gt;'; }
   }
   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"
Личные инструменты
Пространства имён
Варианты
Действия
Навигация
Инструменты