Как заменить xml специальные символы вручную? - PullRequest
0 голосов
/ 05 марта 2009

Мое приложение создает XML-файл, который затем преобразуется xslt в хороший HTML-отчет. Однако у меня проблема с \ n. Для этого есть некоторые методы xslt, но они довольно неудобны и требуют много времени.

Так что мое решение было сделать string.replace \ n для


и затем заставить xmlWriter написать это с помощью WriteRaw (текст). Проблема в том, что в тексте иногда есть недопустимые символы, такие как>.

Я не могу найти какой-либо служебный метод в .net, который просто принимает строку и преобразует ее в строку, дружественную к XML. Я посмотрел с отражателем и класс, который обрабатывает эту логику, не является публичным.

Какие-нибудь идеи (помимо написания собственного кода для этого)?

Ответы [ 2 ]

4 голосов
/ 06 марта 2009

Никогда, никогда не используйте манипуляции со строками для создания XML. Это не просто заставляет плохо социализированных людей смеяться над вами: это приводит к коду, в котором есть ошибки, о которых вы даже не подозреваете.

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

Нет, нет. И вы на самом деле этого не хотите, если только вы не пишете каркас для генерации XML. Вот почему вы используете классы в System.Xml для генерации XML. Люди, которые их написали, сделали эту работу, чтобы вам не пришлось.

Томалак показал, как делать то, что вы пытаетесь делать с XSLT. Если вы используете XmlWriter для генерации XML, используйте этот шаблон:

string s = "replace\nnewlines\nwith\nbreaks";
string[] lines = s.Split('\n');
for (int i=0; i<lines.Length; i++)
{
    xw.WriteString(lines[i]);
    if (i<lines.Length - 1)
    {
        xw.WriteElementString("br", "", "");
    }
}

Здесь используются операции со строками, где это уместно - при работе со строковыми данными вне XML, - и не там, где это не так - при создании текста XML.

3 голосов
/ 05 марта 2009

Думаю, решение этого вопроса поможет вам:

xslt заменить \n на <br/> только в одном узле?

Вы можете включить предоставленный шаблон в процесс трансформации, и все готово, не пачкая руки.

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