[英]Efficient XML parsing in Java | Equivalent of C# XmlDocument in Java
[英]Efficient way of parsing XML in Java
我必須解析具有以下結構的XML文件:
<root>
<object_1>
<pro1> abc </pro1>
<pro2> pqr </pro2>
<pro3> xyz </pro3>
<children>
<object_a>
<pro1> abc </pro1>
<pro2> pqr </pro2>
<pro3> xyz </pro3>
<children>
.
.
.
</children>
</object_a>
</children>
</object_1>
<object_2>
.
.
.
</object_n>
</root>
目的是解析此多層嵌套。 Java中定義了一些類。
Class Object_1
Class Object_2
.
.
.
Class Object_N
及其各自的屬性。
以下代碼對我有用,但這不是最好的處理方式。
File file = new File(fileName);
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(file);
doc.getDocumentElement().normalize();
if(doc ==null) return;
Node node = doc.getFirstChild();
NodeList lst = node.getChildNodes();
Node children = null ;
int len = lst.getLength();
for(int index=0;index<len;index++)
{
Node child = lst.item(index);
String name = child.getNodeName();
if(name=="Name")
name = child.getNodeValue();
else if(name=="Comment")
comment = child.getNodeValue());
else if(name=="children")
children = child;
}
if(children==null) return;
lst = children.getChildNodes();
len = lst.getLength();
Class<?> obj=null;
AbsModel model = null;
for(int index=0;index<len;index++)
{
Node childNode = lst.item(index);
String modelName = childNode.getNodeName();
try {
obj = Class.forName(modelName);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
if(obj!=null)
model = (AbsModel) obj.newInstance();
else
model = new GenericModel();
model.restoreDefaultPropFromXML(childNode);
addChild(model);
}
}
有沒有更好的方法來解析此XML。
考慮使用JAXB ,它是Java自版本6以來的一部分。您應該能夠幾乎沒有代碼地將XML文件解析(“解組”)到您自己的類中,只需添加一些注釋即可明確說明對象結構與您的對象之間的映射。 XML結構。
StAX和/或JAXB幾乎總是行之有效的方法。
如果XML確實是動態的(例如屬性指定屬性名稱),即<prop name="property" value="" />
那么您將僅需要使用StAX或使用JAXB映射到的內容(名稱為POJO和值屬性)和后期處理。
我個人認為結合StAX和JAXB是最好的。 我解析了所需的元素,然后使用JAXB將元素轉換為POJO。
另請參閱 :
盡管JAXB可能是最佳選擇,但我還要提到jOOX ,它提供了類似JQuery的API,並且使XML文檔的使用非常愉快。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.