我正在使用SAX解析器解析一个大的XML文档,但在看到Google上的SAX解析示例后,我无法解析这个XML:
<?xml version="1.0" encoding="UTF-8"?>
<school title="The Clifton School" icon="" browserBackButtonTitle = "Clifton App" navBarColor = "#7eb432">
<screen id = "1" backgroundColor = "" backgroundImg = "" templateId = "12" hasNavigationBar = "0" hasTabBar = "1" >
<navigation-bar title = "" color = "#7eb432" backButtonTitle = "Back">
<!--<navigation-item type = "1" action = "" />-->
</navigation-bar>
<tab-bar numberOfTabs = "4" >
<tab-bar-item title = "Home" image = "tab_home.png" linkedScreen = "101" />
<tab-bar-item title = "Calendar" image = "tab_calendar.png" linkedScreen = "102" />
<tab-bar-item title = "Menu" image = "tab_menu.png" linkedScreen = "604" />
<tab-bar-item title = "Directions" image = "tab_directions.png" linkedScreen = "401" />
<tab-bar-item title = "Contact" image = "tab_contact.png" linkedScreen = "206" />
</tab-bar>
</screen>
这不是完整的XML文档。为了解析它,我创建了5个属性类:
1)School
public class School
{
public String title;
public String icon="";
public String browserBackButtonTitle;
public String navBarColor;
public ArrayList<Screen> screenlist = new ArrayList<Screen>();
}
2)Screen
public class Screen
{
public String Id;
public String backgroundColor;
public String backgroundImg ;
public String templateId;
public String hasNavigationBar;
public String hasTabBar;
public ArrayList<NavigationBar> objlistofNB = new ArrayList<NavigationBar>();
}
3)NavigationBar
public class NavigationBar
{
public String title;
public String color;
public String backButtonTitle;
}
4)ScreenTabBar
public class ScreenTabBar
{
private int numberOfTabs;
private ArrayList<TabBarItem> objlistofTabBarItem = new ArrayList<TabBarItem>();
}
5)TabBarItem
public class TabBarItem
{
public String Title;
public String image;
public String linkedScreen;
}
我覆盖了startElement
方法,在这种方法中我无法应用精确编码 -
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException
{
super.startElement(uri, localName, qName, attributes);
currentElement = true;
if (localName.equals("school"))
{
/** Start */
objschool = new School();
schoolmap = new HashMap<String, String>();
schoolmap.put("school_name", attributes.getValue("title"));
schoolmap.put("school_icon", attributes.getValue("icon"));
schoolmap.put("school_browserBackButtonTitle", attributes.getValue("browserBackButtonTitle"));
schoolmap.put("school_navBarColor", attributes.getValue("navBarColor"));
objschool = (School)parseProperty(objschool,schoolmap);
}
else if (localName.equals("screen"))
{
/** Get attribute value */
objscreen = new Screen();
screenmap.put("screen_id", attributes.getValue("id"));
screenmap.put("screen_backgroundColor", attributes.getValue("backgroundColor"));
screenmap.put("screen_backgroundImg",attributes.getValue("backgroundImg"));
screenmap.put("screen_templateId",attributes.getValue("templateId"));
screenmap.put("screen_hasNavigationBar",attributes.getValue("hasNavigationBar"));
screenmap.put("screen_hasTabBar",attributes.getValue("hasTabBar"));
objscreen =(Screen)parseProperty(objscreen,screenmap);
}
else if (localName.equals("navigation-bar"))
{
objnavBar = new NavigationBar();
navimap.put("naviTitle",attributes.getValue("title"));
navimap.put("navicolor",attributes.getValue("color"));
navimap.put("navibackButtonTitle",attributes.getValue("backButtonTitle"));
objnavBar =(NavigationBar)parseProperty(objnavBar,navimap);
}
else if (localName.equals("tab-bar"))
{
objtabBar = new ScreenTabBar();
tabbarmap.put("numberOfTabs",attributes.getValue("numberOfTabs"));
objtabBar = (ScreenTabBar)parseProperty(objtabBar, tabbarmap);
}
else if (localName.equals("tab-bar-item"))
{
objtabBaritem = new TabBarItem();
tabbarmap.put("Title",attributes.getValue("title"));
tabbarmap.put("Image",attributes.getValue("image"));
tabbarmap.put("LinkedScreen",attributes.getValue("linkedScreen"));
}
}
parseProperty
方法是:
private Object parseProperty(Object t, Map<String,String> list)
{
Class c=null;
String className[]=t.toString().split("@");
try {
String s = t.toString();
c = Class.forName(className[0]);
Field[] f = c.getDeclaredFields();
//for(int i=0; i<list.entrySet().size();i++)
//{
for (String key : list.keySet()) {
System.out.println("key/value: " + key + "/"+list.get(key));
String attrname = key;
for(int j=0; j<f.length;j++)
{
String s2=f[j].getName();
if(s2.equals(attrname))
{
f[j].set(t,list.get(key));
}
}
}
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return t;
}
如何通过我应用的上述规则解析上述XML?
答案 0 :(得分:0)
您好请尝试使用此代码,您需要使用正确的标签位置。希望此代码可以使用
InputStream in =response.getEntity().getContent();
DocumentBuilder builder = DocumentBuilderFactory.newInstance()
.newDocumentBuilder();
Document doc = builder.parse(in);
String responseCode = "";
String extendedMessage = "";
if (doc != null) {
NodeList nl = doc.getElementsByTagName("school");
if (nl.getLength() > 0) {
Node node = nl.item(positionof tab-bar);
Node node1= node.getChildNodes().item(position of tab-bar-item);
responseCode = node.getAttributes().getNamedItem("title");
}
请找到以下代码我解析了readxml函数中的几乎所有子节点和属性值,因为我没有xml的链接我使用assets文件夹来读取该xml文件。在sop语句中可以找到如何从中获取值子节点以及属性
public class XMLSaxParse extends Activity {
/** Called when the activity is first created. */
AssetManager assetManager;
InputStream inputStream;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
try {
inputStream=getAssets().open("sam.xml",Context.MODE_PRIVATE);
readXML();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void readXML()
{
try {
DocumentBuilder builder = DocumentBuilderFactory.newInstance()
.newDocumentBuilder();
Document doc = builder.parse(inputStream);
if (doc != null) {
NodeList nl = doc.getElementsByTagName("screen");
NodeList nodeList=doc.getChildNodes();
System.out.println("Length of NodeList...................................");
System.out.println("Displays id node name from screen tag..................................."+nl.item(0).getAttributes().item(0).getNodeName());
System.out.println("Displays id node value from screen tag..................................."+nl.item(0).getAttributes().item(0).getNodeValue());
System.out.println("Displays naviagtionbar node name (child node)..................................."+nl.item(0).getChildNodes().item(1).getNodeName());
System.out.println("Displays naviagtionbar node Value: (child node)"+nl.item(0).getChildNodes().item(1).getAttributes().item(0).getNodeValue());
System.out.println("Displays tabbar node name (child node)..................................."+nl.item(0).getChildNodes().item(3).getNodeName());
System.out.println("Displays tabbar node Value (child node)..................................."+nl.item(0).getChildNodes().item(3).getNodeValue());
System.out.println("Displays tabbaritem node name (child node of tab-bar)..................................."+nl.item(0).getChildNodes().item(3).getChildNodes().item(1).getNodeName());
System.out.println("Displays tabbaritem node Value (child node of tab-bar)..................................."+nl.item(0).getChildNodes().item(3).getChildNodes().item(1).getAttributes().item(0).getNodeValue());
if (nl.getLength() > 0) {
Node node = nl.item(0);
Node node1= node.getChildNodes().item(0);
/* NamedNodeMap responseCode1 = node1.getAttributes();
Node ex= responseCode1.getNamedItem("title");*/
System.out.println("data displaying.............................."+node.getNodeValue());
}
}
} catch (DOMException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ParserConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}