我正在尝试解析xml文件,但似乎不明白它是如何工作的。我已经调试了好几个小时但似乎无法获得正确的值。我已设法使代码适用于tracklist标记,但不适用于playbacklist标记及其子标记。
我想拥有播放设备的值,将来会添加更多。
这是xml源:
<?xml version="1.0" encoding="ISO-8859-1"?>
<root>
<tracklist>
<track>track001.mp3</track>
<track>track002.mp3</track>
<track>track003.mp3</track>
<track>track004.mp3</track>
<track>track005.mp3</track>
<track>track006.mp3</track>
<track>track007.mp3</track>
<track>track008.mp3</track>
<track>track009.mp3</track>
<track>track010.mp3</track>
</tracklist>
<playbacklist>
<playback>
<name>Speaker1</name>
<ip>192.168.1.103</ip>
<room>Kitchen</room>
<options>0</options>
<state>NotPlaying</state>
</playback>
</playbacklist>
</root>
这是java代码(代码片段):这段代码对我有用
DocumentBuilder db = factory.newDocumentBuilder();
Document doc = db.parse(inStream);
NodeList nodeList = doc.getElementsByTagName("root");
for (int index = 0; index < nodeList.getLength(); index++) {
Node node = nodeList.item(index);
if (node.getNodeType() == Node.ELEMENT_NODE) {
Element element = (Element) node;
NodeList nameNode = element.getChildNodes();
for (int iIndex = 0; iIndex < nameNode.getLength(); iIndex++) {
if (nameNode.item(iIndex).getNodeType() == Node.ELEMENT_NODE) {
Element nameElement = (Element) nameNode.item(iIndex);
if(nameElement.getNodeName().equals("tracklist")){
NodeList trackNodes = nameElement.getChildNodes();
for(int i=0;i<trackNodes.getLength();i++){
if (trackNodes.item(i).getNodeType() == Node.ELEMENT_NODE) {
Element trackElement = (Element) trackNodes.item(i);
playlist.add(trackElement.getFirstChild().getNodeValue());
}
}
}
此代码对我不起作用:
if(nameElement.getNodeName().equals("playbacklist")){
NodeList devicesNodes = nameElement.getChildNodes();
for(int j=0;j<=devicesNodes.getLength();j++){
Node nodeDevice = devicesNodes.item(j);
NodeList childNodes = nodeDevice.getChildNodes();
答案 0 :(得分:4)
我建议您使用SAX
解析器,它比其他人简单且高效
答案 1 :(得分:2)
以下是我的Sax Class Generator
生成的SaxParserpackage sherif.java.sax;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class YourHandler extends DefaultHandler
{
//TAGS /\Sherif/\
private boolean root = false;
private boolean playbacklist = false;
private boolean playback = false;
private boolean name = false;
private boolean ip = false;
private boolean room = false;
private boolean options = false;
private boolean state = false;
private boolean tracklist = false;
private boolean track = false;
public YourHandler()
{
//TODO /\Sherif/\
}
@Override
public void startDocument() throws SAXException
{
super.startDocument();
//TODO /\Sherif/\
}
@Override
public void endDocument() throws SAXException
{
super.endDocument();
//TODO /\Sherif/\
}
@Override
public void characters(char sherifCh[], int sherifSt, int sherifle)
{
String value = (new String(sherifCh)).substring(sherifSt, sherifSt + sherifle);
if(root)
{
if(playbacklist)
{
if(playback)
{
if(name)
{
//TODO /\Sherif/\
}
else if(ip)
{
//TODO /\Sherif/\
}
else if(room)
{
//TODO /\Sherif/\
}
else if(options)
{
//TODO /\Sherif/\
}
else if(state)
{
//TODO /\Sherif/\
}
}
}
else if(tracklist)
{
if(track)
{
//TODO /\Sherif/\
}
}
}
}
@Override
public void startElement(String sherifUr, String sherifNa, String sherifQn, org.xml.sax.Attributes sherifAt) throws SAXException
{
super.startElement(sherifUr, sherifNa, sherifQn, sherifAt);
if(sherifNa.equals("root"))
{
this.root = true;
}
else if(sherifNa.equals("playbacklist"))
{
this.playbacklist = true;
}
else if(sherifNa.equals("playback"))
{
this.playback = true;
}
else if(sherifNa.equals("name"))
{
this.name = true;
}
else if(sherifNa.equals("ip"))
{
this.ip = true;
}
else if(sherifNa.equals("room"))
{
this.room = true;
}
else if(sherifNa.equals("options"))
{
this.options = true;
}
else if(sherifNa.equals("state"))
{
this.state = true;
}
else if(sherifNa.equals("tracklist"))
{
this.tracklist = true;
}
else if(sherifNa.equals("track"))
{
this.track = true;
}
}
@Override
public void endElement(String sherifUr, String sherifNa, String sherifQn) throws SAXException
{
super.endElement(sherifUr, sherifNa, sherifQn);
if(sherifNa.equals("root"))
{
this.root = false;
}
else if(sherifNa.equals("playbacklist"))
{
this.playbacklist = false;
}
else if(sherifNa.equals("playback"))
{
this.playback = false;
}
else if(sherifNa.equals("name"))
{
this.name = false;
}
else if(sherifNa.equals("ip"))
{
this.ip = false;
}
else if(sherifNa.equals("room"))
{
this.room = false;
}
else if(sherifNa.equals("options"))
{
this.options = false;
}
else if(sherifNa.equals("state"))
{
this.state = false;
}
else if(sherifNa.equals("tracklist"))
{
this.tracklist = false;
}
else if(sherifNa.equals("track"))
{
this.track = false;
}
}
}
你可以使用它:
String yourXmlString;
SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser sp = spf.newSAXParser();
XMLReader xr = sp.getXMLReader();
/* Create a new instance of the class generated */
YourHandler handler = new YourHandler ();
xr.setContentHandler(handler);
InputSource inputSource = new InputSource();
inputSource.setEncoding("UTF-8");
inputSource.setCharacterStream(new StringReader(response));
/* Start Parsing */
xr.parse(inputSource);
/* Parsing Done. */