gpt4 book ai didi

java - 解析 xml 文档的更优雅的方式

转载 作者:太空宇宙 更新时间:2023-11-04 07:03:31 24 4
gpt4 key购买 nike

目前我递归地解析我的 xml 文档。我询问是否有任何子节点,如果有,它将迭代子节点列表,并检查这些子节点是否有子节点。我的基本情况是它不再有 child 了。现在解析是正确的,我得到了一个按正确顺序排列的大节点列表。

我想做的是让每个节点成为它自己的对象。因此实体将是一个包含索引对象、列对象等的对象。我的第一种思维方式是迭代一个循环,并使用一个 switch 语句检查它命中的每个节点并创建将添加到实体的对象。我认为大的 switch 语句是不正确的。

这里是 xml 的示例:

<ENTITY_DEFS>
<ENTITY name="WORKORDER">
<INDEXES>
<INDEX name="IDX_WO_1">WORKORDERID</INDEX>
<INDEX name="IDX_WO_2">WONUM, SITEID</INDEX>
<INDEX name="IDX_WO_3">ASSETNUM, SITEID</INDEX>
<INDEX name="IDX_WO_4">LOCATION, SITEID</INDEX>
</INDEXES>
<COLUMNS>
<COLUMN autokey="Y" autokeyprefix="LOCAL" parentkeycol="PARENTID" uniquekey="Y">WORKORDERID</COLUMN>
<COLUMN displaykey="Y" autokey="Y" autokeyprefix="OFFLN">WONUM</COLUMN>
<COLUMN>PARENTID</COLUMN>
<COLUMN>PARENT</COLUMN>
<COLUMN>DESCRIPTION</COLUMN>
<COLUMN>LONGDESCRIPTION</COLUMN>
<COLUMN>LOCATION</COLUMN>
<COLUMN>ASSETNUM</COLUMN>
<COLUMN>PERSONGROUP</COLUMN>
<COLUMN>CREWID</COLUMN>
<COLUMN>SUPERVISOR</COLUMN>
<COLUMN>LEAD</COLUMN>
<COLUMN>PHONE</COLUMN>
<COLUMN>REPORTEDBY</COLUMN>
<COLUMN>REPORTDATE</COLUMN>
<COLUMN>STATUS</COLUMN>
<COLUMN>STATUSDATE</COLUMN>
<COLUMN>WOPRIORITY</COLUMN>
<COLUMN>WORKTYPE</COLUMN>
<COLUMN>FAILURECODE</COLUMN>
<COLUMN>PROBLEMCODE</COLUMN>
<COLUMN>ISTASK</COLUMN>
<COLUMN>ORIGRECORDID</COLUMN>
<COLUMN>ESTDUR</COLUMN>
<COLUMN>OBSERVATION</COLUMN>
<COLUMN>MEASUREMENTVALUE</COLUMN>
<COLUMN>TASKID</COLUMN>
<COLUMN>SITEID</COLUMN>
<COLUMN>ORGID</COLUMN>
</COLUMNS>
<INIT_ACTION>
<ACTION>offline/getMyWorkOrderListJson.action</ACTION>
<ACTION>offline/getMyTaskWorkOrderListJson.action</ACTION>
</INIT_ACTION>
<DELTA_ACTION>
<ACTION>offline/getDeltaMyWorkOrderListJson.action</ACTION>
<ACTION>offline/getDeltaMyTaskWorkOrderListJson.action</ACTION>
</DELTA_ACTION>
<SYNC_ACTIONS transentityname="WORKORDER" transentitykey="WORKORDERID">
<ACTION name="INSERT" beanname="OfflineDataSyncAction" methodname="addWorkOrder"/>
<ACTION name="EDIT" beanname="OfflineDataSyncAction" methodname="editWorkOrder"/>
<ACTION name="INSERT_TASK" beanname="OfflineDataSyncAction" methodname="addTaskWorkOrder"/>
<ACTION name="UPDATE_STATUS" beanname="OfflineDataSyncAction" methodname="updateWorkOrderStatus"/>
<ACTION name="UPDATE_TASK" beanname="OfflineDataSyncAction" methodname="updateWorkOrderTask"/>
<ACTION name="UPDATE_TASK_STATUS" beanname="OfflineDataSyncAction" methodname="updateWorkOrderStatus"/>
<ACTION name="EMM_FILE_UPLOAD"/>
</SYNC_ACTIONS>
</ENTITY>

我的递归语句:

public void parse(final Document doc,final List<Node> nodelist, final Element el)
{
final NodeList children = el.getChildNodes();
for(int i = 0; i < children.getLength(); i++)
{
final Node node = children.item(i);

if(node.getNodeType() == Node.ELEMENT_NODE)
{
nodelist.add(node);
parse(doc,nodelist,(Element)node);
}
}
}

最佳答案

更优雅的方法是仅传递节点,因为您的 nodelist 是通过单个对象遍历的。这样,您就可以避免冗余参数。

此外,您可以将 el 设置为要捕获的 nodename 的静态字符串:

public static void parse(Node node) {
NodeList children = node.getChildNodes();
for (int i = 0; i < children.getLength(); i++) {
Node currentNode = children.item(i);
if (node.getNodeType() == Node.ELEMENT_NODE)
parse(currentNode);

}

if (node.getNodeName().equals(EL_NAME)) {
System.out.println("This -> " + node.getTextContent());
}

}

关于java - 解析 xml 文档的更优雅的方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21760609/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com