Шаблон состояния упростит / упростит ваш код. Смотри здесь
XPath действительно на самом деле включает метод выполнения этого безопасно, в котором это разрешает ссылки на переменную в форме $varname
в выражениях. Библиотека, на которой базируется SimpleXML PHP, обеспечивает интерфейс для предоставления переменных, однако это не выставляется функцией xpath в примере.
Как демонстрация действительно, насколько простой это может быть:
>>> from lxml import etree
>>> n = etree.fromstring('<n a=\'He said "I'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"')
Отметьте, Вы не можете использовать выход в форме '
за пределами 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)));
}
function xPathQuery($attr) {
$xml = simplexml_load_file('example.xml');
$to_encode = array('&', '"');
$to_replace = array('&','"');
$attr = replace($to_encode, $to_replace, $attr);
return $xml->xpath("//myElement[@content=\"{$attr}\"]");
}
Хорошо, что это делает?
Это кодирует все происшествия и и "как & и " в строке, которая должна дать Вам безопасный селектор для того конкретного использования. Обратите внимание, что я также заменил внутреннее 'в xpath с".Править: Было с тех пор указано, что' может быть оставлен как ' таким образом, Вы могли использовать, какой бы ни строковый метод заключения в кавычки Вы предпочитаете.
Я создал бы одноэлементный XML-документ с помощью DOM, использовать DOM, чтобы установить текст элемента на обеспеченное значение и затем захватить текст из строкового представления DOM XML. Это гарантирует, что весь символьный выход сделан правильно, и не только символ, выходящий из этого, я, оказывается, думаю о бесцеремонно.
Править: Причина я использовал бы DOM в таких ситуациях, состоит в том, что люди, которые записали DOM, прочитали рекомендацию XML, и я не имею (по крайней мере, не с уровнем ухода, который они имеют). Для выбора тривиального примера DOM сообщит об ошибке анализа, если текст будет содержать символ, который не позволяет XML (как #x8), потому что авторы DOM реализовали раздел 2.2 из рекомендации XML.
Теперь, я мог бы сказать, "хорошо, я просто получу список недопустимых символов из рекомендации XML и разделю их из входа". Уверенный. Позвольте нам просто посмотреть рекомендация XML и... гм, какого черта блоки суррогата Unicode? Какой код я должен написать для избавлений от них? Они могут даже войти в мой текст во-первых?
Давайте предположим, что я понимаю это. Есть ли другие аспекты того, как рекомендация XML указывает символьные представления, о которых я не знаю? Вероятно. Они окажут влияние на то, что я пытаюсь реализовать? Возможно.
Если я позволяю DOM сделать кодировку символов для меня, я не должен волноваться ни об одном том материале.