使用java从XML中查找Duplicate Entity标记

时间:2014-04-04 12:58:39

标签: java xml dom xml-parsing

在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中有任何内容)

有没有办法获得所有这四个实体?

由于  阿图尔

2 个答案:

答案 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);
    }