如何通过属性值解析XML?
How to parse XML by attribute values?
简介
我有一个从网站获得的摘要 "country.xml" 文件,如下所示
我需要通过它的属性名称来解析这个 xml。
比如我想要这样一个列表:
Country: Germany
Population: 82521653
GDP: 3466000000000
Country: Switzerland
Population: 8417700
GDP: 659800000000
问题是标签名称几乎相同。
我现在得到的
Country: Germany
Population: Germany
GDP: Germany
Country: Switzerland
Population: Switzerland
GDP: Switzerland
Country: Austria
Population: Austria
GDP: Austria
MainActivity.java
public class MainActivity extends Activity {
TextView tv1;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv1=(TextView)findViewById(R.id.textView1);
try {
InputStream is = getAssets().open("country.xml");
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(is);
Element element=doc.getDocumentElement();
element.normalize();
NodeList nList = doc.getElementsByTagName("Country");
for (int i=0; i<nList.getLength(); i++) {
Node node = nList.item(i);
if (node.getNodeType() == Node.ELEMENT_NODE) {
Element element2 = (Element) node;
tv1.setText(tv1.getText()+"\nCountry : " + getValue("string", element2)+"\n");
tv1.setText(tv1.getText()+"Population : " + getValue("string", element2)+"\n");
tv1.setText(tv1.getText()+"GDP : " + getValue("string", element2)+"\n");
tv1.setText(tv1.getText()+"-----------------------");
}
}
} catch (Exception e) {e.printStackTrace();}
}
private static String getValue(String tag, Element element) {
NodeList nodeList = element.getElementsByTagName(tag).item(0).getChildNodes();
Node node = nodeList.item(0);
return node.getNodeValue();
}
}
Country.xml
<Country>
<string name="CountryName">Germany</string>
<string name="Population">82521653</string>
<null name="Area">357385</null>
<null name="GDP">3466000000000</null>
</Country>
<Country>
<string name="CountryName">Switzerland</string>
<string name="Population">8417700</string>
<null name="Area">41285</null>
<null name="GDP">659800000000</null>
</Country>
<Country>
<string name="CountryName">Austria</string>
<string name="Population">8772865</string>
<null name="Area">83878</null>
<null name="GDP">386700000000</null>
</Country>
问题
如何通过其属性名称获取值?
我试过的是:
tv1.setText(tv1.getText()+"\nCountry : " + getValue("string name=\"CountryName\"", element2)+"\n");
但这给了我一个空字符串。
我认为,您不能直接通过属性名称获取元素的textContent。
但是你可以这样做:
像您一样为每个国家/地区调用 getValue,但为其提供正确的标签名称(如 "CountryCode")。
在 getValue() 中,您首先获得 Country 元素的子节点列表。
然后获取每个子节点的属性名称并将其与标签名称进行比较。如果相等,则您 return 元素的 textContent。
看看这里,它是这样工作的:
public class MainActivity extends Activity {
TextView tv1;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv1=(TextView)findViewById(R.id.textView1);
try {
InputStream is = getAssets().open("country.xml");
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(is);
Element element=doc.getDocumentElement();
element.normalize();
NodeList nList = doc.getElementsByTagName("Country");
for (int i=0; i<nList.getLength(); i++) {
Node node = nList.item(i);
if (node.getNodeType() == Node.ELEMENT_NODE) {
Element element2 = (Element) node;
tv1.setText(tv1.getText()+"\nCountry : " + getValue("CountryName", element2)+"\n");
tv1.setText(tv1.getText()+"Population : " + getValue("Population", element2)+"\n");
tv1.setText(tv1.getText()+"GDP : " + getValue("GDP", element2)+"\n");
tv1.setText(tv1.getText()+"-----------------------");
}
}
} catch (Exception e) {e.printStackTrace();}
}
private static String getValue(String tag, Element element) {
NodeList childNodes = element.getChildNodes();
for (int i=0 ; i<childNodes.getLength() ; i++) {
if (childNodes.item(i).hasAttributes()) {
String attributeName = childNodes.item(i).getAttributes().item(0).getNodeValue();
if (attributeName.equals(tag)) {
return childNodes.item(i).getTextContent();
}
}
}
return null;
}
}
简介
我有一个从网站获得的摘要 "country.xml" 文件,如下所示 我需要通过它的属性名称来解析这个 xml。
比如我想要这样一个列表:
Country: Germany
Population: 82521653
GDP: 3466000000000
Country: Switzerland
Population: 8417700
GDP: 659800000000
问题是标签名称几乎相同。
我现在得到的
Country: Germany
Population: Germany
GDP: Germany
Country: Switzerland
Population: Switzerland
GDP: Switzerland
Country: Austria
Population: Austria
GDP: Austria
MainActivity.java
public class MainActivity extends Activity {
TextView tv1;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv1=(TextView)findViewById(R.id.textView1);
try {
InputStream is = getAssets().open("country.xml");
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(is);
Element element=doc.getDocumentElement();
element.normalize();
NodeList nList = doc.getElementsByTagName("Country");
for (int i=0; i<nList.getLength(); i++) {
Node node = nList.item(i);
if (node.getNodeType() == Node.ELEMENT_NODE) {
Element element2 = (Element) node;
tv1.setText(tv1.getText()+"\nCountry : " + getValue("string", element2)+"\n");
tv1.setText(tv1.getText()+"Population : " + getValue("string", element2)+"\n");
tv1.setText(tv1.getText()+"GDP : " + getValue("string", element2)+"\n");
tv1.setText(tv1.getText()+"-----------------------");
}
}
} catch (Exception e) {e.printStackTrace();}
}
private static String getValue(String tag, Element element) {
NodeList nodeList = element.getElementsByTagName(tag).item(0).getChildNodes();
Node node = nodeList.item(0);
return node.getNodeValue();
}
}
Country.xml
<Country>
<string name="CountryName">Germany</string>
<string name="Population">82521653</string>
<null name="Area">357385</null>
<null name="GDP">3466000000000</null>
</Country>
<Country>
<string name="CountryName">Switzerland</string>
<string name="Population">8417700</string>
<null name="Area">41285</null>
<null name="GDP">659800000000</null>
</Country>
<Country>
<string name="CountryName">Austria</string>
<string name="Population">8772865</string>
<null name="Area">83878</null>
<null name="GDP">386700000000</null>
</Country>
问题
如何通过其属性名称获取值?
我试过的是:
tv1.setText(tv1.getText()+"\nCountry : " + getValue("string name=\"CountryName\"", element2)+"\n");
但这给了我一个空字符串。
我认为,您不能直接通过属性名称获取元素的textContent。
但是你可以这样做:
像您一样为每个国家/地区调用 getValue,但为其提供正确的标签名称(如 "CountryCode")。 在 getValue() 中,您首先获得 Country 元素的子节点列表。 然后获取每个子节点的属性名称并将其与标签名称进行比较。如果相等,则您 return 元素的 textContent。
看看这里,它是这样工作的:
public class MainActivity extends Activity {
TextView tv1;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv1=(TextView)findViewById(R.id.textView1);
try {
InputStream is = getAssets().open("country.xml");
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(is);
Element element=doc.getDocumentElement();
element.normalize();
NodeList nList = doc.getElementsByTagName("Country");
for (int i=0; i<nList.getLength(); i++) {
Node node = nList.item(i);
if (node.getNodeType() == Node.ELEMENT_NODE) {
Element element2 = (Element) node;
tv1.setText(tv1.getText()+"\nCountry : " + getValue("CountryName", element2)+"\n");
tv1.setText(tv1.getText()+"Population : " + getValue("Population", element2)+"\n");
tv1.setText(tv1.getText()+"GDP : " + getValue("GDP", element2)+"\n");
tv1.setText(tv1.getText()+"-----------------------");
}
}
} catch (Exception e) {e.printStackTrace();}
}
private static String getValue(String tag, Element element) {
NodeList childNodes = element.getChildNodes();
for (int i=0 ; i<childNodes.getLength() ; i++) {
if (childNodes.item(i).hasAttributes()) {
String attributeName = childNodes.item(i).getAttributes().item(0).getNodeValue();
if (attributeName.equals(tag)) {
return childNodes.item(i).getTextContent();
}
}
}
return null;
}
}