【问题标题】:Find Duplicate Entity tag from XML using java使用java从XML中查找重复的实体标签
【发布时间】:2014-05-16 19:27:11
【问题描述】:

在 XML 文件中声明了一些实体

对于经验:

<?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 中有)

有什么办法可以得到所有四个实体?

谢谢 阿图尔

【问题讨论】:

    标签: java xml dom xml-parsing


    【解决方案1】:

    “DocumentType”通过接口定义丢弃重复的属性“entities”和“notations”(参见 W3C DOM Spec.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 的第二个声明。此地图中的每个节点 还实现了实体接口。 DOM Level 2 不支持 编辑实体,因此不能以任何方式更改实体。

    我认为您需要使用另一种方法来解析/检查此信息...例如你可以使用正则表达式。

    【讨论】:

      【解决方案2】:

      正如@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);
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多