Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > XML, XSL > XML-сущности (<!ENTITY>)


Автор: PsiMagistr 5.10.2016, 14:38
Ребята, помогите разобраться с <!ENTITY>

есть внешний dtd-файл. Все элементы из него зачитываются (XML соответствует валидации).

Код

<!ELEMENT test (settings, finish+, question+)>
<!ATTLIST test language CDATA #REQUIRED>
<!ELEMENT settings (title, exit)>
<!ELEMENT title (#PCDATA)> 
<!ELEMENT exit (#PCDATA)>
<!ATTLIST exit href CDATA #REQUIRED>
<!ELEMENT finish (message)>
<!ELEMENT message (#PCDATA|range)*>
<!ELEMENT range (#PCDATA)>
<!ATTLIST range min CDATA #REQUIRED
max CDATA #REQUIRED>
<!ATTLIST finish id ID #REQUIRED>
<!ELEMENT question (answer+)>
<!ATTLIST question id ID #IMPLIED
value CDATA #REQUIRED>
<!ELEMENT answer (set*, unset*, if*, unless*)>
<!ATTLIST answer value CDATA #REQUIRED
weight CDATA #IMPLIED
goto IDREF #IMPLIED>
<!ELEMENT set EMPTY>
<!ATTLIST set name CDATA #REQUIRED>
<!ELEMENT unset EMPTY>
<!ATTLIST unset name CDATA #REQUIRED>
<!ELEMENT if EMPTY>
<!ATTLIST if name CDATA #REQUIRED
goto IDREF #REQUIRED>
<!ELEMENT unless EMPTY>
<!ATTLIST unless name CDATA #REQUIRED
goto IDREF #REQUIRED>
<!ENTITY br '&lt;br /&gt;'>. 



 Все, кроме 





Код

<!ENTITY br '&lt;br /&gt;'>. 

Сущности упорно отказываются валидироваться. А при открытии XML файла в мозилле, получаю сообщение "Сущность br не определена".

Благодарю всех участников.

Автор: diadiavova 5.10.2016, 16:38
Я, конечно, не силен в DTD, но, возможно lt и gt тоже объявить надо прежде чем использовать. В XML их можно использовать и так без объявления, но не факт, что в дтд это тоже так.

Автор: PsiMagistr 5.10.2016, 17:29
Цитата(diadiavova @ 5.10.2016,  16:38)
Я, конечно, не силен в DTD, но, возможно lt и gt тоже объявить надо прежде чем использовать. В XML их можно использовать и так без объявления, но не факт, что в дтд это тоже так.

Благодарю за Ваше участие!

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

Код

 <!ENTITY br "Vasya">


Автор: LSD 5.10.2016, 18:46
Я попробовал в Altova XML Spy и &br; прекрасно сработало. XML Spy сам ее подсказывает.
Покажи свой XML.

Автор: PsiMagistr 6.10.2016, 09:15
Цитата(LSD @ 5.10.2016,  18:46)
Я попробовал в Altova XML Spy и &br; прекрасно сработало. XML Spy сам ее подсказывает.
Покажи свой XML.

Сердечно благодарю за участие!

Код

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE test SYSTEM "../../../8th_day_tests.dtd">
<test language="../../../language/RU.ini">
    <settings>
        <title>Кто такой Человек Восьмого Дня?</title>
        <exit href="http://algart.net/ru/8th_day_of_creation/man_of_8th_day/">Перейти к статье Кто такой человек Восьмого Дня</exit>
    </settings>    
    <finish id="last1">
        <message>Умолчание</message>             
                
        <!-- Комментарий -->
        <!--<default>Вы набрали %d из %d максимально возможных баллов. Просто великолепно! Вы человек восьмого дня! Не может такого быть.</default>    -->
    </finish>
    <finish id="last2">
        <message>
            Вы набрали %d из %d максимально возможных баллов. Просто великолепно!
            Вы человек восьмого дня!
            Не может такого быть.  
        </message> 
            <range min="0" max="10"><message>Вы набрали %d из %d максимально возможных баллов. Пока Вы нам не подходите. Потренеруйтесь еще.</message></range>
            <range min="11" max="20"><message>Вы набрали %d из %d максимально возможных баллов. Увы, но пока Вы нам все еще не подходите..</message></range>
            <range min="21" max="30"><message>Вы набрали %d из %d максимально возможных баллов. Вы человек 8 дня. но пока только наполовину.</message></range>
            <range min="31" max="40"><message>Вы набрали %d из %d максимально возможных баллов. Ооо! Вы прешли больше половины теста.</message></range>
            <range min="41" max="50"><message>Вы набрали %d из %d максимально возможных баллов. Еще немножечко. Подтянитесь.</message></range>
            <range min="51" max="60"><message>Вы набрали %d из %d максимально возможных баллов. Вы растете!</message></range>
            <range min="71" max="80"><message>Вы набрали %d из %d максимально возможных баллов. Скоро перейдете Рубикон!</message></range>
            <range min="81" max="84"><message>Вы набрали %d из %d максимально возможных баллов. Последняя капля осталась!</message></range>
        <!-- Комментарий -->
        <!--<default>Вы набрали %d из %d максимально возможных баллов. Просто великолепно! Вы человек восьмого дня! Не может такого быть.</default>    -->
    </finish>
    <question id="level7" value="Понимаете ли вы цель своей жизни?&lt;br/&gt;Понимаете &br; или нет?">    <!-- Вот сущность &br -->
        <answer value="Да" weight="5" />
        <answer value="Нет" goto="level1" />
    </question>
    <question value="Где во времени находится цель вашей жизни?">    
        <answer value="Я планирую достичь своей цели в течении своей жизни" />
        <answer value="Цель моей жизни находится за пределами этой конкретной земной жизни" weight="5" />
    </question>
    <question id="level1" value="Вы готовы практически работать, здесь и сейчас, ради достижения своей цели?">    
        <answer value="Да, я уже работаю" weight="5" />
        <answer value="Нет, в данный момент у меня нет возможности: очень занят на работе, должен кормить семью, должен/должна заботиться о маленьком ребенке, мешает болезнь, какие-то другие причины..." goto="level6" />
    </question>
    <question value="Готовы ли вы, работая ради достижения своей цели, изменить себя и свой образ жизни?">    
        <answer value="Да" weight="2" />
        <answer value="Нет" />        
    </question>
    <question value="Готовы ли вы, работая ради достижения своей цели, изменить окружающий мир?">    
        <answer value="Да" weight="3" />
        <answer value="Нет" />        
    </question>        
    <question id="level6" value="Есть ли у Вас устойчивая система ценностей?">    
        <answer value="Да" weight="5" />
        <answer value="Нет" goto="level2" />
    </question>
    <question value="Готовы ли вы, в рамках системы ценностей, усложнять мышление и развивать себя?">    
        <answer value="Да" weight="5" />
        <answer value="Нет" />    
    </question>
    <question id="level2" value="Каково ваше отношение к существующей реальности 7-го Дня Творения?">
        <answer value="Тяжело, но пока приходится жить в этой реальности" goto="level5" />
        <answer value="Я не могу жить в этом мире" weight="5" />
    </question>
    <question value="Готовы ли вы творить новую реальность вместе с другими людьми 8-го Дня?">    
        <answer value="Да" weight="5" />
        <answer value="Нет" />    
    </question>
    <question id="level5" value="Вы готовы работать в рамках тех правил и парадигм, которые вам предлагают другие (общество, религия, государство, семья и т.д.)?">    
        <answer value="Да, ведь выбора нет" goto="level3" />
        <answer value="Нет, я так не могу" weight="5" />       
    </question>
    <question value="Вы умеете и готовы формулировать собственные правила и парадигмы, чтобы работать в соответствии с ними?">
        <answer value="Да" weight="5" />
        <answer value="Нет" />
    </question>
    <question id="level3" value="Вы заинтересованы в развитии своего потенциала?">
        <answer value="Да" weight="5" />
        <answer value="Нет" goto="level4" />
    </question>
    <question value="Вы готовы задействовать свой потенциал для развития Мира?">
        <answer value="Да" weight="5" />
        <answer value="Нет" />
    </question>
    <question id="level4" value="Стремитесь ли Вы к постоянному и всеобщему диалогу">
        <answer value="Да" weight="5" />
        <answer value="Нет" goto="last2" />
    </question>    
    <question value="Вы стремитесь к диалогу с самим собой?">
        <answer value="Да" weight="5">
            <set name="dialog"/>
        </answer>
        <answer value="Нет" />
    </question>
    <!--Комментарий -->
    <!--Комментарий -->
    <question value="Вы стремитесь к диалогу с другими людьми?">
    <!--Комментарий -->
        <answer value="Да" weight="5">
           <set name="dialog" />
        </answer>
        <answer value="Нет" />
    </question>
    <question value="Вы стремитесь к диалогу с Миром?">
        <answer value="Да" weight="5">           
           <set name="dialog" />           
        </answer>
        <answer value="Нет" />
    </question>
    <question value="Вы стремитесь и готовы к диалогу с Богом?">
        <answer value="Да" weight="5" goto="last2" />
        <answer value="Нет" weight="0">
           <if name="dialog" goto="last2"/>
        </answer>
    </question>
    <!--Комментарий -->
    <!--Комментарий -->
    <!--Комментарий -->
    <!--Комментарий -->
    <question value="Но вы же сказали, что стремитесь к всеобщему диалогу! По-видимому, это не так. Попробуйте еще раз!">
        <answer value="Вернуться к вопросу про диалог" goto="level4">
         <unset name="dialog"/>         
        </answer>        
    </question>
</test>


И DTD


Код

<!ELEMENT test (settings, finish+, question+)>
<!ATTLIST test language CDATA #REQUIRED>
<!ELEMENT settings (title, exit)>
<!ELEMENT title (#PCDATA)> 
<!ELEMENT exit (#PCDATA)>
<!ATTLIST exit href CDATA #REQUIRED>
<!ELEMENT finish (message, range*)>
<!ELEMENT message (#PCDATA)>
<!ELEMENT range (message)>
<!ATTLIST range min CDATA #REQUIRED
max CDATA #REQUIRED>
<!ATTLIST finish id ID #REQUIRED>
<!ELEMENT question (answer+)>
<!ATTLIST question id ID #IMPLIED
value CDATA #REQUIRED>
<!ELEMENT answer (set*, unset*, if*, unless*)>
<!ATTLIST answer value CDATA #REQUIRED
weight CDATA #IMPLIED
goto IDREF #IMPLIED>
<!ELEMENT set EMPTY>
<!ATTLIST set name CDATA #REQUIRED>
<!ELEMENT unset EMPTY>
<!ATTLIST unset name CDATA #REQUIRED>
<!ELEMENT if EMPTY>
<!ATTLIST if name CDATA #REQUIRED
goto IDREF #REQUIRED>
<!ELEMENT unless EMPTY>
<!ATTLIST unless name CDATA #REQUIRED
goto IDREF #REQUIRED>
<!ENTITY br "Vasya">


Код

Warning: DOMDocument::load() [domdocument.load]: Entity 'br' not defined in file:///Z:/home/magictest/www/tests/ru/man_of_8th_day/man_of_8th_day.xml, line: 31 in Z:\home\magictest\www\includes\companion.php on line 5


Браузер Мозилла тоже выдает ошибку при открытии XML "Сущность &br не определена".

Когда я определяю сущности прямо в документе Xml все валидируется. Но стоит мне определить ее во внешнем DTD - ничего не выходит.

Благодарю Вас.

Автор: PsiMagistr 6.10.2016, 10:32
Altova валидирует.

Попытка прочесть документ браузером мозиллы приводит к ошибке (см. приложенный снимок)

Это же касается и функции validate (PHP)

Автор: LSD 6.10.2016, 12:53
Насчет PHP фиг его знает, надо в разделе PHP спрашивать. Я проверил в Java, там все ОК, ENTITY загружается успешно.

По поводу Firefox, у них есть пара багов на эту тему: https://bugzilla.mozilla.org/show_bug.cgi?id=69799, https://bugzilla.mozilla.org/show_bug.cgi?id=22942 и судя по всему фиксать они это не будут:
Цитата
shows that neither Opera (with default settings) nor Chrome load the external subset even from the same origin

Автор: PsiMagistr 6.10.2016, 14:58
Благодарю Вас.

Попробую спросить в разделе PHP

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)