2016-10-27 8 views
1

У меня проблема, когда мне нужно добавить DTD, содержащий ENTITY, заключенные в скобки в определении, в существующий XML-документ.Есть ли какой-то эквивалент в Java для Nokogiri Ruby :: XML :: EntityDecl?

Например, работая из спецификации для MathML в DAISY на http://www.daisy.org/projects/mathml/mathml-in-daisy-spec.html, скажем, я даюсь это XML с помощью внешнего источника:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE dtbook PUBLIC "-//NISO//DTD dtbook 2005-2//EN" 
"http://www.daisy.org/z3986/2005/dtbook-2005-2.dtd"> 
<dtbook xmlns="http://www.daisy.org/z3986/2005/dtbook/" xmlns:m="http://www.w3.org/1998/Math/MathML" 
    version="2005-3" xml:lang="eng"> 
    <m:math xmlns:dtbook="http://www.daisy.org/z3986/2005/dtbook/" 
    id="math0001" dtbook:smilref="nativemathml.smil#math0001" 
    altimg="nativemathml0001.png" 
    alttext="sigma-summation UnderScript i equals zero OverScript infinity EndScripts x Subscript i"> 
     <m:mrow> 
     <m:mstyle displaystyle='true'> 
      <m:munderover> 
      <m:mo>&#x2211;</m:mo> 
      <m:mrow> 
       <m:mi>i</m:mi><m:mo>=</m:mo><m:mn>0</m:mn> 
      </m:mrow> 
      <m:mi>&#x221E;</m:mi> 
      </m:munderover> 
      <m:mrow> 
      <m:msub> 
       <m:mi>x</m:mi> 
       <m:mi>i</m:mi> 
      </m:msub> 
      </m:mrow> 
     </m:mstyle> 
     </m:mrow> 
</m:math> 
</dtbook> 

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

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE dtbook PUBLIC "-//NISO//DTD dtbook 2005-2//EN" 
"http://www.daisy.org/z3986/2005/dtbook-2005-2.dtd" 
[ 
    <!ENTITY % MATHML.prefixed "INCLUDE" > 
    <!ENTITY % MATHML.prefix "m"> 
    <!ENTITY % MATHML.Common.attrib 
      "xlink:href CDATA  #IMPLIED 
      xlink:type  CDATA  #IMPLIED 
      class   CDATA  #IMPLIED 
      style   CDATA  #IMPLIED 
      id    ID   #IMPLIED 
      xref   IDREF  #IMPLIED 
      other   CDATA  #IMPLIED 
      xmlns:dtbook CDATA  #FIXED 'http://www.daisy.org/z3986/2005/dtbook/' 
      dtbook:smilref CDATA  #IMPLIED" 
    > 
    <!ENTITY % mathML2 PUBLIC "-//W3C//DTD MathML 2.0//EN" 
      "http://www.w3.org/Math/DTD/mathml2/mathml2.dtd" 
    > 
    %mathML2; 
    <!ENTITY % externalFlow "| m:math"> 
    <!ENTITY % externalNamespaces "xmlns:m CDATA #FIXED 
    'http://www.w3.org/1998/Math/MathML'"> 
] 
> 
<dtbook xmlns="http://www.daisy.org/z3986/2005/dtbook/" xmlns:m="http://www.w3.org/1998/Math/MathML" 
    version="2005-3" xml:lang="eng"> 
    <m:math xmlns:dtbook="http://www.daisy.org/z3986/2005/dtbook/" 
    id="math0001" dtbook:smilref="nativemathml.smil#math0001" 
    altimg="nativemathml0001.png" 
    alttext="sigma-summation UnderScript i equals zero OverScript infinity EndScripts x Subscript i"> 
     <m:mrow> 
     <m:mstyle displaystyle='true'> 
      <m:munderover> 
      <m:mo>&#x2211;</m:mo> 
      <m:mrow> 
       <m:mi>i</m:mi><m:mo>=</m:mo><m:mn>0</m:mn> 
      </m:mrow> 
      <m:mi>&#x221E;</m:mi> 
      </m:munderover> 
      <m:mrow> 
      <m:msub> 
       <m:mi>x</m:mi> 
       <m:mi>i</m:mi> 
      </m:msub> 
      </m:mrow> 
     </m:mstyle> 
     </m:mrow> 
</m:math> 
</dtbook> 

в Ruby есть метод Nokogiri, который может быть использован для добавления этих определений Entity, что выглядит следующим образом: Nokogiri :: XML :: EntityDecl. N ew ("MATHML.prefixed", doc, MATHML_ENTITY_DECL_TYPE, nil, nil, "INCLUDE")

Есть ли эквивалент этого в Java? Мы используем JDOM для манипулирования нашими документами XML, но класс JDOM DocType не поддерживает эти определения сущностей.

ответ

1

С JDOM вы должны иметь возможность проанализировать исходный документ и вытащить узел DTDContent из документа.

Ваш код будет выглядеть примерно так:

Document doc = saxBuilder.build(myxmlfile); 
DocType dtd = doc.getDocType(); 

Это dtd содержание должно быть ссылка на dtbook ссылки.

Теперь вы можете взять строковое представление деклараций mathml и включить их в качестве внутреннего документа DocType (возможно, вы хотите прочитать его из файла или в качестве системного ресурса или что-то еще).

String internal = " <!ENTITY % MATHML.prefixed \"INCLUDE\" >\n" 
    + " <!ENTITY % MATHML.prefix \"m\">\n" 
    + ...... 

dtd.setInternalSubset(internal); 

См: http://www.jdom.org/docs/apidocs/org/jdom2/DocType.html#setInternalSubset(java.lang.String)

Это изменит декларацию, и, если вы выводить XML, вы должны иметь содержание, которое Вы ожидаете:

XMLOutputter xout = new XMLOutputter(); 
xout.output(doc, System.out); 
+0

Это интересно. Я загрузил образец файла с объединенным DTIS DAISY/MathML DTD, и в отладчике я мог видеть, что внутренняя сущность DocType пуста. Когда я распечатал документ с помощью XMLOutputter, аналогично тому, что у вас здесь, внутренние определения ENTITY были удалены. Мы используем JDOM 1, поэтому я задаюсь вопросом, есть ли проблема с этой версией или что-то мне не хватает в моем использовании. Я попробую установить innerSubset в качестве следующего эксперимента. –

+0

Вы должны использовать JDOM 2.x ;-) Это alteady half-a-ten-old – rolfl

+0

Поверьте мне, когда наш бюджет и время позволит, мы это сделаем. Но это не совсем для меня. Эта база кода составляет ~ 10 лет, и повсюду есть много ссылок на JDOM 1.1.3. –

 Смежные вопросы

  • Нет связанных вопросов^_^