Java中是否有与Ruby';s Nokogiri::XML::EntityDecl?

Java中是否有与Ruby';s Nokogiri::XML::EntityDecl?,java,nokogiri,dtd,jdom,mathml,Java,Nokogiri,Dtd,Jdom,Mathml,我有一个问题,我需要在现有XML文档中预先添加一个DTD,该DTD包含定义中括号内的实体 例如,根据DAISY at中的MathML规范,假设我是由外部源提供此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"> &l

我有一个问题,我需要在现有XML文档中预先添加一个DTD,该DTD包含定义中括号内的实体

例如,根据DAISY at中的MathML规范,假设我是由外部源提供此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>

∑;
i=0
∞;
x
我
我想添加规范中的实体定义,使本书支持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>

%数学2;
]
>
∑;
i=0
∞;
x
我
在Ruby中,Nokogiri中有一个方法可用于添加以下实体定义: Nokogiri::XML::EntityDecl.new(“MATHML.prefixed”,doc,MATHML_ENTITY_DECL_TYPE,nil,nil,“INCLUDE”)


Java中是否有与此等效的语言?我们正在使用JDOM操作XML文档,但JDOM DocType类似乎不支持这些实体定义。

使用JDOM,您应该能够解析原始文档,并从文档中提取DTDContent节点

您的代码看起来像:

Document doc = saxBuilder.build(myxmlfile);
DocType dtd = doc.getDocType();
dtd
内容应为
dtbook
参考的参考

现在,您可以获取mathml声明的字符串表示形式,并将其作为DocType的内部子集包含(可能您希望从文件或系统资源或其他内容中读取它)


这很有趣。我加载了一个带有组合DAISY/MathML DTD的示例文件,在调试器中我可以看到DocType的内部子集为空。当我用XMLOutputter打印文档时,与这里的内容类似,内部实体定义被剥离了。我们正在使用JDOM 1,所以我想知道这个版本是否有问题,或者我在使用中遗漏了什么。我将尝试将internalSubset设置为下一个实验。您应该使用JDOM 2.x;-)它已经有五年了相信我,当我们的预算和时间允许的时候,我们会的。但这并不完全取决于我。这个代码库已有10年历史,到处都有很多对JDOM 1.1.3的小引用。我尝试过JDOM 1.1.3和JDOM 2,但都拒绝使用SaxBuilder.build(InputStream)从文件中读取InternalSubset实体。另一方面,按照此处的说明将内部子集实体添加到没有内部子集实体的文件中,效果很好。现在,我将研究如何在重新读取该文件进行进一步处理时不丢失这些实体。谢谢
String internal = "  <!ENTITY % MATHML.prefixed \"INCLUDE\" >\n"
    + "  <!ENTITY % MATHML.prefix \"m\">\n"
    + ......

dtd.setInternalSubset(internal);
XMLOutputter xout = new XMLOutputter();
xout.output(doc, System.out);