Как получить предупреждающее сообщение как строку при проверке XML с schemaValidate () в PHP?

Мне нравится решение для закрытия за то, что оно было "инструментом для очистки" и большим количеством Pythonic (так +1 к ответу mmarshall), но формы Django также имеют механизм обратного вызова, который можно использовать для фильтрации querysets в formsets.

Это также не документируется, который я думаю, индикатор, Django devs не мог бы понравиться он так же.

, Таким образом, Вы в основном создаете свой formset то же, но добавляете обратный вызов:

ServiceFormSet = forms.formsets.formset_factory(
    ServiceForm, extra=3, formfield_callback=Callback('option', affiliate).cb)

Это создает экземпляр класса, который похож на это:

class Callback(object):
    def __init__(self, field_name, aff):
        self._field_name = field_name
        self._aff = aff
    def cb(self, field, **kwargs):
        nf = field.formfield(**kwargs)
        if field.name == self._field_name:  # this is 'options' field
            nf.queryset = ServiceOption.objects.filter(affiliate=self._aff)
        return nf

Это должно дать Вам общее представление. Это - немного более сложное создание обратного вызова метод объекта как это, но дает Вам немного больше гибкости в противоположность выполнению простого функционального обратного вызова.

7
задан Edward Tanguay 28 August 2009 в 08:39
поделиться

2 ответа

Я думаю, вы можете использовать функции обработки ошибок libxml для этого:

Простой пример:

$file = 'test.xml';
$schema = 'test.xsd';
$dom = new DOMDocument;
$dom->load($file);

libxml_use_internal_errors(true);     
if ($dom->schemaValidate($schema)) {
    print "$file is valid.\n";
} else {
    print "$file is invalid.\n";
    $errors = libxml_get_errors();
    foreach ($errors as $error) {
        printf('XML error "%s" [%d] (Code %d) in %s on line %d column %d' . "\n",
            $error->message, $error->level, $error->code, $error->file,
            $error->line, $error->column);
    }
    libxml_clear_errors();
}
libxml_use_internal_errors(false); 
16
ответ дан 6 December 2019 в 12:53
поделиться

Если вам нужно только распечатать, вы можете определить свой собственный обработчик ошибок , чтобы распечатать ошибку.

0
ответ дан 6 December 2019 в 12:53
поделиться
Другие вопросы по тегам:

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