Существует ли способ выйти из маркера конца CDATA в xml?

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

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

public class Student {

    private int id;

    public int getId() {
        return this.id;
    }

    public setId(int newId) {
        this.id = newId;
    }
}

Приведенный ниже код дает вам исключение с нулевым указателем.

public class School {

    Student obj_Student;

    public School() {
        try {
            obj_Student.getId();
        }
        catch(Exception e) {
            System.out.println("Null Pointer ");
        }
    }
}

Поскольку вы используете Obj_Student, но вы забыли инициализировать его, как в правильном коде, показанном ниже:

public class School {

    Student obj_Student;

    public School() {
        try {
            obj_Student = new Student();
            obj_Student.setId(12);
            obj_Student.getId();
        }
        catch(Exception e) {
            System.out.println("Null Pointer ");
        }
    }
}
126
задан Aaron Digulla 3 September 2013 в 10:49
поделиться

3 ответа

Очевидно, этот вопрос является чисто академическим. К счастью, это имеет очень определенный ответ.

Вы не можете выйти из последовательности конца CDATA. Порождающее правило 20 спецификации XML довольно ясно:

[20]    CData      ::=      (Char* - (Char* ']]>' Char*))

РЕДАКТИРОВАНИЕ: Это правило продукта буквально означает, что "Раздел CData может содержать что-либо, что Вы хотите ТОЛЬКО последовательность']]>'. Никакое исключение. ".

EDIT2: тот же раздел также чтения:

В разделе CDATA, только строка CDEnd распознана как разметка, так, чтобы открывающие угловые скобки и амперсанды могли произойти в их литеральной форме; им нужно не (и не может) быть оставленным с помощью" <" и" &". Разделы CDATA не могут вложить.

, Другими словами, не возможно использовать ссылку на сущность, разметку или любую другую форму интерпретируемого синтаксиса. Единственный проанализированный текст в разделе CDATA ]]>, и он завершает раздел.

Следовательно, не возможно выйти ]]> в разделе CDATA.

EDIT3: тот же раздел также чтения:

2.7 Раздела CDATA

[Определение: разделы CDATA могут произойти где угодно, символьные данные могут произойти; они используются для выхода из блоков текста, содержащего символы, которые были бы иначе распознаны как разметка. Разделы CDATA начинаются со строки "<! [CDATA [" и конец со строкой"]] >";:]

Затем может быть раздел CDATA где угодно, символьные данные могут произойти, включая несколько смежных разделов CDATA, оперативных из единственного раздела CDATA. Это позволяет этому быть возможным разделить ]]> маркер и поместить две части его в смежных разделах CDATA.

исключая:

<![CDATA[Certain tokens like ]]> can be difficult and <invalid>]]> 

должен быть записан как [1 125]

<![CDATA[Certain tokens like ]]]]><![CDATA[> can be difficult and <valid>]]> 
134
ответ дан 24 November 2019 в 00:50
поделиться

Необходимо разломать данные на кусочки для сокрытия ]]>.

Вот все это:

<![CDATA[]]]]><![CDATA[>]]>

первое <![CDATA[]]]]> имеет ]]. Второе <![CDATA[>]]> имеет >.

167
ответ дан 24 November 2019 в 00:50
поделиться

S. Ответ Lott является правильным: Вы не кодируете конечный тэг, Вы повреждаете его через несколько разделов CDATA.

, Как натыкаться на эту проблему в реальном мире: использование XML-редактора для создания XML-документа, который будет питаться в систему управления контентом, попытайтесь написать статью о разделах CDATA. Ваш обычный прием встраивающих код образцов в разделе CDATA приведет Вас к сбою здесь. Можно вообразить, как я изучил это.

, Но при большинстве обстоятельств, Вы не встретитесь с этим и здесь почему: если Вы хотите сохранить (говорят), что текст XML-документа как содержание элемента XML, Вы будете, вероятно, использовать метод DOM, например:

XmlElement elm = doc.CreateElement("foo");
elm.InnerText = "<[CDATA[[Is this a problem?]]>";

И DOM вполне обоснованно выходит из < и>, что означает, что Вы непреднамеренно не встроили раздел CDATA в свой документ.

, О, и это интересно:

XmlDocument doc = new XmlDocument();

XmlElement elm = doc.CreateElement("doc");
doc.AppendChild(elm);

string data = "<![[CDATA[This is an embedded CDATA section]]>";
XmlCDataSection cdata = doc.CreateCDataSection(data);
elm.AppendChild(cdata);

Это - вероятно, особенность DOM.NET, но это не выдает исключение. Исключение выдается здесь:

Console.Write(doc.OuterXml);

я предположил бы, что то, что происходит под капотом, - то, что XmlDocument использует XmlWriter, производят его вывод и проверки XmlWriter на отмеченность, как он пишет.

7
ответ дан 24 November 2019 в 00:50
поделиться
Другие вопросы по тегам:

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