如何使这个功能更短/更高效

时间:2017-05-18 12:08:01

标签: java xml

一个简单的问题:如何使这个功能更短或更高效:

private String getOCC_Name(Document doc) {
    String occ_name = "";
    NodeList nl = doc.getElementsByTagName("Occurrence");
    for (int x = 0; x < nl.getLength(); x++) {
        Element e = (Element) nl.item(x);
        if (checkId(e, this.getPrimaryOccurenceRef().getId() /* = id7*/)) {
            String instancedRef = e.getAttributes().getNamedItem("instancedRef").getNodeValue().replace("#", "");
            NodeList pr = doc.getElementsByTagName("ProductRevision");
            for (int p = 0; p < pr.getLength(); p++) {
                Element pre = (Element) pr.item(p);
                if (checkId(pre, instancedRef)) {
                    String DatasetId = pre.getElementsByTagName("AssociatedDataSet").item(0).getAttributes().getNamedItem("dataSetRef").getNodeValue().replace("#", "");
                    NodeList ds = doc.getElementsByTagName("DataSet");
                    for (int dsi = 0; dsi < ds.getLength(); dsi++) {
                        if (checkId((Element) ds.item(dsi), DatasetId)) {
                            String[] memberRefs = ds.item(dsi).getAttributes().getNamedItem("memberRefs").getNodeValue().replace("#", "").split(" ");
                            NodeList efs = doc.getElementsByTagName("ExternalFile");
                            for (int efl = 0; efl < efs.getLength(); efl++) {
                                for (String m : memberRefs) {
                                    if (checkId((Element) efs.item(efl), m) && efs.item(efl).getAttributes().getNamedItem("format").getNodeValue().equalsIgnoreCase("asm")) {
                                        occ_name = efs.item(efl).getAttributes().getNamedItem("locationRef").getNodeValue().split("\\\\")[1];
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    return occ_name;
}
private Boolean checkId(Element e, String toCheck) {
    if (e.getAttributes().getNamedItem("id").getNodeValue().equalsIgnoreCase(toCheck)) {
        return true;
    }
    return false;
}

我需要按照以下方式获取我想要的字符串:

primaryOccurrence(参考“id7”) - &gt; instancedRefs - &gt;

Productrevision(参考instancedRefs) - &gt; associatedDataSet - &gt;

数据集(引用associatedDataSet) - &gt; memberRefs - &gt;

ExternalFile(参考memberRefs) - &gt;的 locationRef

编辑:

我的问题与标记的副本无关......

1 个答案:

答案 0 :(得分:0)

问:如何使这个功能更短/更高效?

答:使用XPath查询来查找您正在寻找的节点,而不是遍历整个树:

以下是一些教程: