Я работаю с файлами XML:org.w3c.dom.Document в JAVA
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<IDFS>
<sunnydry>
<idf>4.3562937</idf>
<nbrOfRep>1.0</nbrOfRep>
</sunnydry>
<bresnahan>
<idf>4.3562937</idf>
<nbrOfRep>1.0</nbrOfRep>
</bresnahan>
<half>
<idf>3.9534276</idf>
<nbrOfRep>5.7123914</nbrOfRep>
</half>
</IDFS>
и я использую эти функции для чтения любого IDF и nbrOfRep в слове
public float getIdfOfWordIndocument(String str)
{
try
{
return Float.parseFloat(document.getElementsByTagName(str.toLowerCase())
.item(0).getChildNodes().item(0).getTextContent());
}
catch(Exception e)
{
return 0.0f;
}
}
// To read nbr of reputation of a word
public float getNbrOfRepfWordIndocument(String str)
{
return Float.parseFloat(document.getElementsByTagName(str.toLowerCase())
.item(0).getChildNodes().item(1).getTextContent());
}
Первый один дает ошибку, а второй дает неверный результат. Однако, когда я изменить код для этого:
public float getIdfOfWordIndocument(String str)
{
try
{
return Float.parseFloat(document.getElementsByTagName(str.toLowerCase())
.item(0).getChildNodes().item(1).getTextContent());
}
catch(Exception e)
{
return 0.0f;
}
}
// To read nbr of reputation of a word
public float getNbrOfRepfWordIndocument(String str)
{
return Float.parseFloat(document.getElementsByTagName(str.toLowerCase())
.item(0).getChildNodes().item(3).getTextContent());
}
Обе функции работают очень хорошо, но я не мог понять, почему я должен сделать это изменение:
В 1: .item (0) -> .item (1) и в 2: .item (1) -> .item (3)
Я использую этот код для записи файла XML:
public void addToXML(String str, float idf, float nbrOfRep)
{
Element e = null;
Element name = null;
Element rootEle = (Element) document.getFirstChild();
// create data elements and place them under root
name = document.createElement(str.toLowerCase());
rootEle.appendChild(name);
e = document.createElement("idf");
e.appendChild(document.createTextNode(Float.toString(idf)));
name.appendChild(e);
e = document.createElement("nbrOfRep");
e.appendChild(document.createTextNode(Float.toString(nbrOfRep)));
name.appendChild(e);
// doc.appendChild(rootEle);
try{
Transformer tr = TransformerFactory.newInstance().newTransformer();
tr.setOutputProperty(OutputKeys.INDENT, "yes");
tr.setOutputProperty("{http://xml.apache.org/xslt}indent- amount","6");
// send DOM to file
try{
tr.transform(new DOMSource(document), new StreamResult( new FileOutputStream(filePath)));
}
catch (FileNotFoundException e)
{
// TODO Auto-generated catch block
e.printStackTrace(); }
}
catch (TransformerException te)
{
System.out.println(te.getMessage());
}
}// end
В дополнение к ответу Робби: вы должны найти подэлементы по имени тега вместо того, чтобы просто получать дочерние узлы по индексу. Эти текстовые узлы могут исчезнуть, если XML отформатирован по-разному. Код будет более четким и надежным. –