请问下面的代码是你的问题的解决方案?
XML
<?xml version="1.0"?>
<categories>
<category name="ABC">
<subcategory name="123"
loc="C://program files"
link="www.sample.com"
parentnode="ABC"/>
<subcategory name="456"
loc="C://program files"
link="http://"
parentnode="ABC"/>
</category>
<category name="XYZ">
<subcategory name="123"
loc="C://program files"
link="www.sample.com"
parentnode="XYZ"/>
<subcategory name="456"
loc="C://program files"
link="http://abc.com"
parentnode="XYZ"/>
</category>
</categories>
JAVA
package com.stackoverflow;
import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
public class Question6855476 {
private static final String CFG_XML_PATH = "D:\\sample\\path\\question6855476.xml";
private static final String searchArg = "ABC";
public static void main(String[] args) {
List locList = getLocsByCategoryName(searchArg);
List linkList = getLinksByCategoryName(searchArg);
printCollection(locList,"LOC");
printCollection(linkList,"LINKS");
}
private static void printCollection(List locList, String string) {
System.out.println();
System.out.println("### Collection: "+string+"\n");
if(locList.isEmpty()) {
System.out.println("\tNo items. Collection is empty.");
} else {
for(Object obj: locList) {
System.out.println("\t"+obj);
}
}
}
private static List getLocsByCategoryName(String catName) {
if(null==catName||catName.length()<=0) {
System.out.println("ERROR: catName is null/blank");
return Collections.EMPTY_LIST;
} else {
return getSubcatAttrValuesByAttrName("loc", catName);
}
}
private static List getLinksByCategoryName(String catName) {
if(null==catName||catName.length()<=0) {
System.out.println("ERROR: catName is null/blank");
return Collections.EMPTY_LIST;
} else {
return getSubcatAttrValuesByAttrName("link", catName);
}
}
private static List<Object> getSubcatAttrValuesByAttrName(String attrName, String catName) {
List<Object> list = new ArrayList<Object>();
if(null==attrName||attrName.length()<=0) {
System.out.println("ERROR: attrName is null/blank");
} else {
try {
File file = new File(CFG_XML_PATH);
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.parse(file);
doc.getDocumentElement().normalize();
NodeList catLst = doc.getElementsByTagName("category");
for (int i = 0; i < catLst.getLength(); i++) {
Node cat = catLst.item(i);
NamedNodeMap catAttrMap = cat.getAttributes();
Node catAttr = catAttrMap.getNamedItem("name");
if(catName.equals(catAttr.getNodeValue())){ // CLUE!!!
NodeList subcatLst = cat.getChildNodes();
for (int j = 0; j < subcatLst.getLength(); j++) {
Node subcat = subcatLst.item(j);
NamedNodeMap subcatAttrMap = subcat.getAttributes();
if(subcatAttrMap!=null) {
Node subcatAttr = subcatAttrMap.getNamedItem(attrName);
list.add(subcatAttr.getNodeValue());
}
}
}
}
} catch (Exception e) { // FIXME
e.printStackTrace();
}
}
return list;
}
}
我基于this article
你怎么办 “分析”? DOM,SAX,XPath,还是你推出自己的? –
忘了包括, – RAAAAM
你有超过你需要解析XML控制使用的SAXParser?我的意思是你自己决定它看起来如何?然后我发现使用'parentnode'属性很奇怪。 ' '似乎是构建xml更好的方法。并在SAX中捕获类名为“blah”的事件,然后解析(或跳过)应该不会太难。 SAX教程详细解释了如何做到这一点。作为事后的想法:也许你可以改变XSD/XML来使用节点和值,以及更少的属性。取决于你的设计。 –
Wivani