Java中是否有与Ruby';s Nokogiri::XML::EntityDecl?
我有一个问题,我需要在现有XML文档中预先添加一个DTD,该DTD包含定义中括号内的实体 例如,根据DAISY at中的MathML规范,假设我是由外部源提供此XML的: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 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>∑</m:mo>
<m:mrow>
<m:mi>i</m:mi><m:mo>=</m:mo><m:mn>0</m:mn>
</m:mrow>
<m:mi>∞</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>∑</m:mo>
<m:mrow>
<m:mi>i</m:mi><m:mo>=</m:mo><m:mn>0</m:mn>
</m:mrow>
<m:mi>∞</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);