解析XML包含多个属性
问题描述:
我解析使用SAX解析器大的XML文档,但看到的对谷歌SAX解析的例子之后,我无法解析这个XML:解析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
方法中,我不能这样做如何运用精确codition-
@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以上规则是由我应用的?
答
你好,请试试这个代码,你需要使用tags.Hope的正确位置,此代码将工作
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的链接我使用的资产文件夹读取SOP语句XML file.With可以找到如何获取值从子节点以及属性
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();
}
}
}
你似乎使用SAX解析器。看看DOM解析器,我敢打赌,你会发现更容易理解。你可以谷歌“android dom解析器”并获取资源。 – slezica 2012-03-20 11:21:16
但我可以使用xml大小很大吗? – learner 2012-03-20 11:23:37
“很大”有多大?如果“非常”确实是DOM非常大的话,我仍然会看看其他解析器。盲目编写SAX(特别是Java)是一件偷偷摸摸,耗时的工作。如果你需要更小的内存空间,Android有一个与SAX非常相似的PULL解析器,但它有一个(在我看来)更加健壮的界面。 – slezica 2012-03-20 11:27:24