Преобразование специфических символов в поток XML - PullRequest
0 голосов
/ 11 февраля 2009

У меня есть поток XML, который содержит специальные символы, такие как ', хранящиеся в объекте CString. Есть ли другой метод, кроме замены отдельных символов в потоке для преобразования этих специальных символов?

Ответы [ 3 ]

3 голосов
/ 11 февраля 2009

Единственные символы, которые нужно экранировать, это "<> &.

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

0 голосов
/ 11 февраля 2009

Если вы можете, установите фильтр в писатель. Это позволяет вам записывать потоковый символ на символ и заменять специальные символы при их обнаружении (избавляя вас от необходимости выделять второй строковый объект).

Попробуйте вывести как можно больше символов строки одновременно, потому что вызов write () в цикле для каждого отдельного символа стоит дорого. Вместо этого используйте этот псевдокод:

int start = 0;
for (int i=0; i<str.length(); i++) {
    char c = str.getChar(i);
    String emit = null;
    switch (c) {
    case '<': emit = "&lt;"; break;
    case '>': emit = "&gt;"; break;
    case '\'': emit = "&apos;"; break;
    case '"': emit = "&quot;"; break;
    }
    if (emit != null) {
        write(str,start,i);
        start = i;
        write(emit);
    }
}
if (start != str.length()) {
    write(str);
}

В общем случае цикл будет проходить строку один раз (что быстро) и вызывать write () один раз.

Если вы не можете установить фильтр в модуле записи, вы можете использовать тот же код для фильтрации строки. В общем случае вы просто вернете входную строку. В if (emit != null) вы можете выделить новую копию. Но так как это произойдет только в том случае, если в строке есть специальные символы, это намного дешевле, чем создание копии для каждой строки.

0 голосов
/ 11 февраля 2009

Честно говоря, я не вижу другого варианта.

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