使用 SAX 解析器遍历 xml 文档并以所需格式打印输出
traversing xml document using SAX parser and printing output in desired format
我正在尝试解析附加的 xml(请查找附件)文件。
xml 文件如给定 below.check 附件 1 和 2
sample data of xml file
为了解析这个 xml,我使用了 SAX 解析器。程序如下
package com.dom;
import java.io.File;
import java.io.IOException;
import java.util.Enumeration;
import java.util.Hashtable;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.helpers.DefaultHandler;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
public class DemoXML {
File file;
SAXParserFactory factory;
SAXParser saxParser;
UserHandler handler;
public void loadXML()
{
file = new File("E:/fifthWorkbenchProjects/XMLUtility/src/input/FIXBOND.xml");
System.out.println(file.exists());
}
public void readXML()
{
factory = SAXParserFactory.newInstance();
try {
saxParser = factory.newSAXParser();
handler = new UserHandler();
try {
saxParser.parse(file,handler);
} catch (IOException e) {
e.printStackTrace();
}
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
}
}
public static void main(String args[])
{
DemoXML ob = new DemoXML();
ob.loadXML();
ob.readXML();
}
}
class UserHandler extends DefaultHandler
{
Hashtable tags;
@Override
public void startDocument()
{
System.out.println("Document started");
tags = new Hashtable();
}
@Override
public void endDocument()
{
System.out.println("Documents ended");
}
@Override
public void startElement(String namespaceURI,String localName,String qname,Attributes atts) throws SAXException
{
// System.out.println("Element started");
// if(qname.equals("Currency"))
System.out.print(qname+"-->");
}
@Override
public void endElement(String uri,String localName, String qname)
{
}
@Override
public void characters(char[] ch, int start, int length)
{
String str = new String(ch,start,length);
System.out.println(str);
System.out.println();
}
}
我按以下方式获得输出。
真的
文档开始
FIgovcorpagncy-->InstrumentDescription-->InstrumentType-->FI GOVCORPAGNCY
InstrumentSubType-->FIXDBOND
仪器名称-->QUEENSNR 0% 07/06/2016
仪器描述-->QUEENSNR 0% 07/06/2016
货币-->GBP
仪器状态-->活跃
未付金额-->48384375
AmtOutstandingDate-->2012-06-27T00:00:00.000
PrincipalExchange-->N
CountryOfRisk-->GB
仪器完整性-->50
CapitalRanking-->1
发行时-->发行日期-->2012-06-27T00:00:00.000
原始发行量-->48384375
PrivatePlacementFlag-->Y
最小面额-->1000
最小增量-->0.01
等等....我能够访问所有节点但是在这里观察到树中第一个元素的一件事,完整的元素地址打印如下
FIgovcorpagncy-->InstrumentDescription-->InstrumentType-->FI GOVCORPAGNCY
然后对于树中的其余元素,它打印标签名称和相应的值,如
InstrumentSubType-->FIXDBOND
仪器名称-->QUEENSNR 0% 07/06/2016
仪器描述-->QUEENSNR 0% 07/06/2016
货币-->GBP
仪器状态-->活跃
未付金额-->48384375
等等....
这里我的要求是我也想以完全分层的方式打印这些元素作为第一个元素。
怎么办?
class UserHandler 扩展了 DefaultHandler
{
列表 li_elements,li_values;
LinkedHashMap<List<String>,List<String>> hm;
boolean endElementFlag;
@Override
public void startDocument()
{
System.out.println("Document started");
li_elements = new ArrayList<String>();
li_values=new ArrayList<String>();
}
@Override
public void endDocument()
{
System.out.println("Documents ended"+hm.size());
for(Map.Entry m:hm.entrySet())
{
System.out.println(m.getKey()+""+m.getValue());
}
}
@Override
public void startElement(String namespaceURI,String localName,String qname,Attributes atts) throws SAXException
{
li_elements.add(qname);
//System.out.println("Element Started");
//System.out.println(qname+" added in element list");
}
@Override
public void endElement(String uri,String localName, String qname)
{
if(!li_values.isEmpty())
{
System.out.println("Element address list:-"+li_elements+"and Corresponding Value:-"+li_values);
System.out.println();
}
li_elements.remove(li_elements.size()-1);
li_values.clear();
}
@Override
public void characters(char[] ch, int start, int length)
{
String str = new String(ch,start,length);
li_values.add(str);
}
}
我期待这样的事情。这会以我希望的格式打印输出。
我正在尝试解析附加的 xml(请查找附件)文件。 xml 文件如给定 below.check 附件 1 和 2
sample data of xml file
为了解析这个 xml,我使用了 SAX 解析器。程序如下
package com.dom;
import java.io.File;
import java.io.IOException;
import java.util.Enumeration;
import java.util.Hashtable;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.helpers.DefaultHandler;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
public class DemoXML {
File file;
SAXParserFactory factory;
SAXParser saxParser;
UserHandler handler;
public void loadXML()
{
file = new File("E:/fifthWorkbenchProjects/XMLUtility/src/input/FIXBOND.xml");
System.out.println(file.exists());
}
public void readXML()
{
factory = SAXParserFactory.newInstance();
try {
saxParser = factory.newSAXParser();
handler = new UserHandler();
try {
saxParser.parse(file,handler);
} catch (IOException e) {
e.printStackTrace();
}
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
}
}
public static void main(String args[])
{
DemoXML ob = new DemoXML();
ob.loadXML();
ob.readXML();
}
}
class UserHandler extends DefaultHandler
{
Hashtable tags;
@Override
public void startDocument()
{
System.out.println("Document started");
tags = new Hashtable();
}
@Override
public void endDocument()
{
System.out.println("Documents ended");
}
@Override
public void startElement(String namespaceURI,String localName,String qname,Attributes atts) throws SAXException
{
// System.out.println("Element started");
// if(qname.equals("Currency"))
System.out.print(qname+"-->");
}
@Override
public void endElement(String uri,String localName, String qname)
{
}
@Override
public void characters(char[] ch, int start, int length)
{
String str = new String(ch,start,length);
System.out.println(str);
System.out.println();
}
}
我按以下方式获得输出。 真的 文档开始 FIgovcorpagncy-->InstrumentDescription-->InstrumentType-->FI GOVCORPAGNCY
InstrumentSubType-->FIXDBOND
仪器名称-->QUEENSNR 0% 07/06/2016
仪器描述-->QUEENSNR 0% 07/06/2016
货币-->GBP
仪器状态-->活跃
未付金额-->48384375
AmtOutstandingDate-->2012-06-27T00:00:00.000
PrincipalExchange-->N
CountryOfRisk-->GB
仪器完整性-->50
CapitalRanking-->1
发行时-->发行日期-->2012-06-27T00:00:00.000
原始发行量-->48384375
PrivatePlacementFlag-->Y
最小面额-->1000
最小增量-->0.01
等等....我能够访问所有节点但是在这里观察到树中第一个元素的一件事,完整的元素地址打印如下 FIgovcorpagncy-->InstrumentDescription-->InstrumentType-->FI GOVCORPAGNCY
然后对于树中的其余元素,它打印标签名称和相应的值,如 InstrumentSubType-->FIXDBOND
仪器名称-->QUEENSNR 0% 07/06/2016
仪器描述-->QUEENSNR 0% 07/06/2016
货币-->GBP
仪器状态-->活跃
未付金额-->48384375
等等....
这里我的要求是我也想以完全分层的方式打印这些元素作为第一个元素。
怎么办?
class UserHandler 扩展了 DefaultHandler { 列表 li_elements,li_values;
LinkedHashMap<List<String>,List<String>> hm;
boolean endElementFlag;
@Override
public void startDocument()
{
System.out.println("Document started");
li_elements = new ArrayList<String>();
li_values=new ArrayList<String>();
}
@Override
public void endDocument()
{
System.out.println("Documents ended"+hm.size());
for(Map.Entry m:hm.entrySet())
{
System.out.println(m.getKey()+""+m.getValue());
}
}
@Override
public void startElement(String namespaceURI,String localName,String qname,Attributes atts) throws SAXException
{
li_elements.add(qname);
//System.out.println("Element Started");
//System.out.println(qname+" added in element list");
}
@Override
public void endElement(String uri,String localName, String qname)
{
if(!li_values.isEmpty())
{
System.out.println("Element address list:-"+li_elements+"and Corresponding Value:-"+li_values);
System.out.println();
}
li_elements.remove(li_elements.size()-1);
li_values.clear();
}
@Override
public void characters(char[] ch, int start, int length)
{
String str = new String(ch,start,length);
li_values.add(str);
}
}
我期待这样的事情。这会以我希望的格式打印输出。