在XML文件中声明某些实体
表示exp:
<?xml version="1.0" encoding="utf-8"?>
<!--Arbortext, Inc., 1988-2004, v.4002-->
<!DOCTYPE test PUBLIC "-//Atul//DTD ATM - TEST//EN//-"
"test.dtd" [
<!ENTITY ent1 SYSTEM "Graphic/test1.txt" NDATA ccitt4>
<!ENTITY ent1 SYSTEM "Graphic/test1.txt" NDATA ccitt4>
<!ENTITY ent2 SYSTEM "Graphic/test2.txt" NDATA ccitt4>
<!ENTITY ent3 SYSTEM "Graphic/test4.txt" NDATA ccitt4>
]>
<test id="01" >
</test>
我必须发现ent1被多次声明。
目前我们正在使用getEntities方法
NamedNodeMap entities = lJDocumentXML.getDoctype().getEntities();
http://docs.oracle.com/javase/7/docs/api/org/w3c/dom/DocumentType.html#getEntities()
哪个不返回重复实体(它只返回ent1,ent2和ent3)和外部实体(如果引用的dtd中有任何内容)
有没有办法获得所有这四个实体?
由于 阿图尔
答案 0 :(得分:1)
“ DocumentType” 丢弃重复项(请参见W3C DOM规范W3C SPEC - REC-DOM-Level-3-Core)
一个NamedNodeMap,包含外部和外部的常规实体 内部,在DTD中声明。不包含参数实体。 重复项将被丢弃。例如:
<!DOCTYPE ex SYSTEM "ex.dtd" [ <!ENTITY foo "foo"> <!ENTITY bar "bar"> <!ENTITY bar "bar2"> <!ENTITY % baz "baz"> ]> <ex/>
该接口提供对foo和bar的第一个声明的访问 但不是第二次声明bar或baz。该地图中的每个节点 还实现了Entity接口。 DOM 2级不支持 编辑实体,因此不能以任何方式更改实体。
我认为您需要使用另一种方法来解析/检查此信息...例如您可以使用正则表达式。
答案 1 :(得分:1)
如@Ariel所述,默认情况下,“ DocumentType”会丢弃属性“ entities”和“ notations”的重复项。
因此,您可以编写这样的自定义函数。
String fileStr = FileUtils.readFileToString(file);
Pattern pattern = Pattern.compile("<!ENTITY.+SYSTEM");
Matcher matcher = pattern.matcher(fileStr);
ArrayList<String> stringArrayList = new ArrayList <>();
while(matcher.find())
{
String matchedStr = matcher.group();
matchedStr = matchedStr.replace("<!ENTITY","");
matchedStr = matchedStr.replace("SYSTEM","");
matchedStr = matchedStr.trim();
if(stringArrayList.contains(matchedStr))
{
//actions to be taken for duplicates
}
stringArrayList.add(matchedStr);
}