我操作XML非常糟糕,我需要一些帮助。 以下是我的XML文件示例:
<?xml version="1.0"?>
<components>
<resources>
<resource id="House">
<id>int</id>
<type>string</type>
<maxUsage>float</maxUsage>
<minUsage>float</minUsage>
<averageUsage>float</averageUsage>
</resource>
<resource id="Commerce">
<id>int</id>
<type>string</type>
<maxUsage>float</maxUsage>
<minUsage>float</minUsage>
<averageUsage>float</averageUsage>
</resource>
</resources>
<agregatorsType1>
<agregator1 id="CSP">
<id>int</id>
<type>string</type>
</agregator1>
</agregatorsType1>
<soagregatorsType0>
<agregator0 id="VPP">
<id>int</id>
<type>string</type>
</agregator0>
</agregatorsType0>
</components>
我需要打印每个资源的子元素和每个agregator(id,type,maxUsage等)。
以下是我的方法:
public static Document createXMLDocument() throws IOException, Exception {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = factory.newDocumentBuilder();
Document documento = docBuilder.parse(filepath);
documento.getDocumentElement().normalize();
return documento;
}
public static String[] readSubElementsXML() throws IOException, Exception
{
Document documento = createXMLDocument();
//gets XML elements
Element root = documento.getDocumentElement();
NodeList nListR = root.getElementsByTagName("resource");
NodeList nListA1 = root.getElementsByTagName("agregator1");
NodeList nListA0 = root.getElementsByTagName("agregator0");
ArrayList<Node> allNodes = appendNodeLists(nListR, nListA1, nListA0); //this method merges the 3 NodeLists into one ArrayList
int tam = allNodes.size();
String[] vec = new String[tam];
for (int i = 0; i < tam; i++) {
Element elem = (Element) allNodes.get(i);
vec[i] = elem.getAttribute("id");
System.out.println(""+vec[i]);
}
return vec;
}
有了这个我只能得到属性id而我不需要它。我需要打印所有子元素,即使我将子元素添加到我的XML文件中它也必须工作。
我该怎么做?
答案 0 :(得分:1)
根据需要使用elem.getChildNodes()。这将为您提供NodeList
答案 1 :(得分:1)
Element是Node的子类。见Node#getChildNodes() javadoc。
包含此节点的所有子节点的NodeList。如果没有子节点,则这是一个不包含节点的NodeList。
然后您可以遍历子节点,如
NodeList childNodes = elem.getChildNodes();
int childCount = childNodes.getLength();
Node childNode;
for (int i = 0; i < childCount; i++) {
childNode = childNodes.item(i);
// do things with the node
}
答案 2 :(得分:0)
我建议你使用StAX,它是一个非常易于使用的XML,它设计精美,可以读取XML和编写XML。
“StAX是一种标准的XML处理API,允许您从应用程序流式传输XML数据”----来自StAX主页
使用StAX解析所有内容的示例是:
try {
for (int i = 0 ; i < count ; i++) {
// pass the file name.. all relative entity
// references will be resolved against this as
// base URI.
XMLStreamReader xmlr =
xmlif.createXMLStreamReader(filename,
new FileInputStream(filename));
// when XMLStreamReader is created, it is positioned
// at START_DOCUMENT event.
int eventType = xmlr.getEventType();
printEventType(eventType);
printStartDocument(xmlr);
// check if there are more events in the input stream
while(xmlr.hasNext()) {
eventType = xmlr.next();
printEventType(eventType);
// these functions print the information about
// the particular event by calling the relevant
// function
printStartElement(xmlr);
printEndElement(xmlr);
printText(xmlr);
printPIData(xmlr);
printComment(xmlr);
}
}
}
----from http://docs.oracle.com/