JavaベースXMLファイルの解析


まず簡単なコード分析を行います.
 1.主にノードの属性を取り出すため,一定のデータ格納構造が必要である.
   ArrayList detailList = null
 
 public class DetailData {  private String buildingName = "";  private String floorName = "";  private String lineName = "";  private HashMap detailMap = null;
}
 
問題は簡単化しなければならない,一つの方法は同じことしかしない.
/**
	 *   child  
	 * @param node
	 * @param map
	 */
	public void getChild(Node node, HashMap<String, String> map) {

		if (node.hasAttributes()) {
			getAttrByNode(node, map);

		}
		if (node.hasChildNodes()) {
			NodeList n2 = node.getChildNodes();
			for (int j = 0; j < n2.getLength(); j++) {
				getChild((Node) n2.item(j), map);
			}
		}
	}

 
各ノードのプロパティの取り出し
/**
	 *          
	 * @param node
	 * @param map
	 */
	public void getAttrByNode(Node node, HashMap<String, String> map) {

		if (node.hasAttributes()) {

			NamedNodeMap nnm = node.getAttributes();

			int len = nnm.getLength();

			for (int j = 0; j < len; j++) {

				Node attr = nnm.item(j);

				map.put(attr.getNodeName(),
						setValueForNull(attr.getNodeValue()));
			}
		}
	}

 
上記の再帰は、次のXML構造には絶対に問題ありません.
<?xml version="1.0" encoding='UTF-8'?>
<requestSummary currentTime=''  startDay='2009-12-23' endDay='2009-12-23'>
	<dailySummary day='2008-03-01' totalCall='298'
		avgResponseTime='00:05' avgRepairTime='00:35'>
	</dailySummary>
	<dailySummary day='2008-03-01' totalCall='340'
		avgResponseTime='00:03' avgRepairTime='00:50'>
	</dailySummary>
</requestSummary>

 
しかし、次の構造については、対応できません.
<?xml version="1.0" encoding='UTF-8'?>
<requestSummary currentTime=''  startDay='2009-12-23' endDay='2009-12-23'>
<building building='2'>
      <floor floorName='1'>
	<line lineName='N1'>
		<completedInfo seatNo='12' ticket='1'>
			<completedDetail requestTime='43223556647'
					requestStaffNo='H0051' requestStaffName='  '>
			</completedDetail>
		</completedInfo>
		<completedInfo seatNo='13' ticket='2'>
			<completedDetail requestTime='43223556647'
					requestStaffNo='H0050' requestStaffName='  '>
			</completedDetail>
		</completedInfo>
	</line>
     </floor>
</building>

</requestSummary>

 
ラインノードの下に複数のcompletedInfoが表示され、buildingノードも複数表示されます.これで複雑になりますが、上の再帰的な考えがあれば、私たちはまだ方法があります.
 
私たちの考え方は1つのデータ構造が必要で、completedInfoノードを根拠とする記録を1つのオブジェクトとして、完全にそのすべての属性をすべてこのオブジェクトに保存することができて、このオブジェクトはDetailDataで、共通のデータbuildingNameに分けます; floorName ;LineNameとcompletedInfo(detailMapノードデータ)
しかし、この構造にも問題があることがわかりました.データが正しくないので、completedInfoノードの親ノードをすべてHashMapに入れ、1つのオブジェクトのMapが一致するレコードだけを格納することを保証します.
 
最初のステップは、子供のノードと親のノードを検索します.
 
	public void getChildForDetail(Node node) {

		if (node.hasAttributes()) {
			DetailData detailData = new DetailData();

			// setBuildingName
			detailData.setBuildingName(buildingName);

			HashMap<String, String> detailMap = new HashMap<String, String>();

			if ("completedInfo".equals(node.getNodeName())) {

				//       InProgressRequest  ------
				Node parent = node.getParentNode();
				String pName = parent.getNodeName();
				if ("line".equals(pName)) {
					getParentAttr(parent,detailMap);
				}
				
				// InProgressRequest   End-----
				getChildAttrByNode(node, detailMap);
				
				// setDetailMap
				detailData.setDetailMap(detailMap);

				// detailData     
				detailList.add(detailData);
			}

		}
		if (node.hasChildNodes()) {
			NodeList n2 = node.getChildNodes();
			for (int j = 0; j < n2.getLength(); j++) {
				getChildForDetail((Node) n2.item(j));
			}
		}
	}

ステップ2:ノードのプロパティを取り出す
 
/**
	 *   detailDate  
	 * 
	 * @param node
	 *                
	 * @param detailMap
	 *                             
	 */
	public void getChildAttrByNode(Node node,
			HashMap<String, String> detailMap) {

		if (node.hasAttributes()) {
			NamedNodeMap nnm = node.getAttributes();
			int len = nnm.getLength();

			for (int j = 0; j < len; j++) {

				Node attr = nnm.item(j);
				detailMap.put(attr.getNodeName(), setValueForNull(attr
						.getNodeValue()));
			}

		}

		if (node.hasChildNodes()) {
			NodeList n2 = node.getChildNodes();
			for (int j = 0; j < n2.getLength(); j++) {
				getChildAttrByNode((Node) n2.item(j), detailMap);
			}
		}
	}

 
プロジェクトの進展に伴い、他の状況が発生しました.
<?xml version="1.0" encoding='UTF-8'?>
<requestSummary currentTime=''  startDay='2009-12-23' endDay='2009-12-23'>
<building building='2'>
   <floor floorName='1'>
	<line lineName='N1'>
		<completedInfo seatNo='12' ticket='1'>
			<completedDetail requestTime='43223556647'
					requestStaffNo='H0051' requestStaffName='  '>
			</completedDetail>
			<completedDetail requestTime='43223556647'
					requestStaffNo='H0050' requestStaffName='  '>
			</completedDetail>
		</completedInfo>
	</line>
     </floor>
</building>
</requestSummary>

重要なノードループの場所が変化する
同じように、難しくありません.私たちはまだ解決することができます.
 
xml解析のファイルとソースコード