Очистка/очистка xpath атрибуты

Шаблон состояния упростит / упростит ваш код. Смотри здесь

6
задан 9 October 2008 в 19:32
поделиться

3 ответа

XPath действительно на самом деле включает метод выполнения этого безопасно, в котором это разрешает ссылки на переменную в форме $varname в выражениях. Библиотека, на которой базируется SimpleXML PHP, обеспечивает интерфейс для предоставления переменных, однако это не выставляется функцией xpath в примере.

Как демонстрация действительно, насколько простой это может быть:

>>> from lxml import etree
>>> n = etree.fromstring('<n a=\'He said "I&apos;m here"\'/>')
>>> n.xpath("@a=$maybeunsafe", maybeunsafe='He said "I\'m here"')
True

Это использует lxml, обертку Python для той же базовой библиотеки как SimpleXML, с подобной функцией xpath. Булевские переменные, числа и наборы узлов могут также быть переданы непосредственно.

Если переключение на более способный интерфейс XPath не является опцией, обходное решение, когда дали внешняя строка была бы чем-то (не стесняйтесь адаптироваться к PHP) вроде:

def safe_xpath_string(strvar):
    if "'" in strvar:
        return "',\"'\",'".join(strvar.split("'")).join(("concat('","')"))
    return strvar.join("''")

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

>>> print safe_xpath_string("basic")
'basic'
>>> print safe_xpath_string('He said "I\'m here"')
concat('He said "I',"'",'m here"')

Отметьте, Вы не можете использовать выход в форме &apos; за пределами XML-документа, и при этом универсальных стандартных программ сериализации XML не применимы. Однако XPath concat функция может использоваться для создания строки с обоими типами кавычек в любом контексте.

Вариант PHP:

function safe_xpath_string($value)
{
    $quote = "'";
    if (FALSE === strpos($value, $quote))
        return $quote.$value.$quote;
    else
        return sprintf("concat('%s')", implode("', \"'\", '", explode($quote, $value)));
}
6
ответ дан 17 December 2019 в 07:10
поделиться
function xPathQuery($attr) {
    $xml = simplexml_load_file('example.xml');
    $to_encode = array('&', '"');
    $to_replace = array('&amp;','&quot;');
    $attr = replace($to_encode, $to_replace, $attr);
    return $xml->xpath("//myElement[@content=\"{$attr}\"]");
}

Хорошо, что это делает?

Это кодирует все происшествия и и "как &amp; и &quot; в строке, которая должна дать Вам безопасный селектор для того конкретного использования. Обратите внимание, что я также заменил внутреннее 'в xpath с".Править: Было с тех пор указано, что' может быть оставлен как &apos; таким образом, Вы могли использовать, какой бы ни строковый метод заключения в кавычки Вы предпочитаете.

-1
ответ дан 17 December 2019 в 07:10
поделиться

Я создал бы одноэлементный XML-документ с помощью DOM, использовать DOM, чтобы установить текст элемента на обеспеченное значение и затем захватить текст из строкового представления DOM XML. Это гарантирует, что весь символьный выход сделан правильно, и не только символ, выходящий из этого, я, оказывается, думаю о бесцеремонно.

Править: Причина я использовал бы DOM в таких ситуациях, состоит в том, что люди, которые записали DOM, прочитали рекомендацию XML, и я не имею (по крайней мере, не с уровнем ухода, который они имеют). Для выбора тривиального примера DOM сообщит об ошибке анализа, если текст будет содержать символ, который не позволяет XML (как #x8), потому что авторы DOM реализовали раздел 2.2 из рекомендации XML.

Теперь, я мог бы сказать, "хорошо, я просто получу список недопустимых символов из рекомендации XML и разделю их из входа". Уверенный. Позвольте нам просто посмотреть рекомендация XML и... гм, какого черта блоки суррогата Unicode? Какой код я должен написать для избавлений от них? Они могут даже войти в мой текст во-первых?

Давайте предположим, что я понимаю это. Есть ли другие аспекты того, как рекомендация XML указывает символьные представления, о которых я не знаю? Вероятно. Они окажут влияние на то, что я пытаюсь реализовать? Возможно.

Если я позволяю DOM сделать кодировку символов для меня, я не должен волноваться ни об одном том материале.

-1
ответ дан 17 December 2019 в 07:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: