#java #php #android #xml
#java #php #Android #xml
Вопрос:
Как я могу получить данные из xml, который генерируется с помощью php, в java. Мне нужны данные, чтобы отобразить их в listview в моем приложении для Android.
phpcode принимает данные из mysqlquery и извлекает массив в переменной xml и помещает его поверх echo out. Данные для mysqlquery взяты из приложения для Android через POST.
phpcode:
//MySQL zugangsdaten
$server = "server";
$datenbank = "database";
$username = "username";
$passwort = "password";
//Verbindung zur MySqldatenbank herstellen
$link = mysql_connect($server, $username, $passwort);
if (!$link) die(mysql_error());
//Datenbank auswählen
$db = mysql_select_db($datenbank, $link);
//<---- End Login ---->
$_linie = htmlspecialchars(mysql_real_escape_string($_POST["linie"]), ENT_COMPAT);
$_richtung = htmlspecialchars(mysql_real_escape_string($_POST["richtung"]), ENT_COMPAT);
$sql_befehl = "SELECT * From Kontrolleure where linie = '$_linie' AND richtung = '$_richtung'";
$query = mysql_query($sql_befehl, $link);
if(mysql_error())
{
die(mysql_error());
}
while($result = mysql_fetch_array($query, MYSQL_ASSOC))
{
$count = $count 1;
$xml = $xml."<Konduktor>";
$xml = $xml."<id>".$result['id']."</id>";
$xml = $xml."<linie>".$result['linie']."</linie>";
$xml = $xml."<endstation>".$result['richtung']."</endstation>";
$xml = $xml."<station>".$result['station']."</station>";
$xml = $xml."<zeit>".$result['zeit']."</zeit>";
$xml = $xml."</Konduktor>";
}
echo "<Konduktors count="$count">";
echo $xml;
echo "</Konduktors>";
ответ xml выглядит следующим образом:
<Konduktors count="3">
<Konduktor>
<id>29</id>
<linie>S23</linie>
<endstation>Langenthal</endstation>
<station>Brugg AG</station>
<zeit>17:36:34</zeit>
</Konduktor>
<Konduktor>
<id>30</id>
<linie>S23</linie>
<endstation>Langenthal</endstation>
<station>Lupfig</station>
<zeit>17:37:12</zeit>
</Konduktor>
<Konduktor>
<id>32</id>
<linie>S23</linie>
<endstation>Langenthal</endstation>
<station>Birr</station>
<zeit>16:23:30</zeit>
</Konduktor>
</Konduktors>
Спасибо!
Комментарии:
1. Используйте XML-анализатор, как показано в куче руководств по всему Интернету .
2. Вы можете использовать XPath .
Ответ №1:
Для таких вещей существуют инструменты синтаксического анализа xml. В моей работе мы используем XMLBeans: http://xmlbeans.apache.org /
Я обнаружил, что использовать его довольно просто, и я в некотором роде любитель в таких вещах.
Ответ №2:
JAXB справился бы с этим легко:
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.List;
public class JaxbExample {
public static void main(String[] args) throws JAXBException {
String xml =
"<Konduktors count="3">n"
" <Konduktor>n"
" <id>29</id>n"
" <linie>S23</linie>n"
" <endstation>Langenthal</endstation>n"
" <station>Brugg AG</station>n"
" <zeit>17:36:34</zeit>n"
" </Konduktor>n"
" <Konduktor>n"
" <id>30</id>n"
" <linie>S23</linie>n"
" <endstation>Langenthal</endstation>n"
" <station>Lupfig</station>n"
" <zeit>17:37:12</zeit>n"
" </Konduktor>n"
" <Konduktor>n"
" <id>32</id>n"
" <linie>S23</linie>n"
" <endstation>Langenthal</endstation>n"
" <station>Birr</station>n"
" <zeit>16:23:30</zeit>n"
" </Konduktor>n"
"</Konduktors>";
Object object = JAXBContext.newInstance(Konduktors.class).createUnmarshaller().unmarshal(new StringReader(xml));
System.out.println(object);
}
@XmlRootElement(name = "Konduktors")
static class Konduktors {
private List<Konductor> konductors = new ArrayList<Konductor>();
@XmlElement(name = "Konduktor")
public List<Konductor> getKonductors() {
return konductors;
}
public void setKonductors(List<Konductor> konductors) {
this.konductors = konductors;
}
@Override
public String toString() {
return "Konductors{"
"konductors=" konductors
'}';
}
}
static class Konductor {
private int id;
private String linie;
private String endstation;
private String zeit;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getLinie() {
return linie;
}
public void setLinie(String linie) {
this.linie = linie;
}
public String getEndstation() {
return endstation;
}
public void setEndstation(String endstation) {
this.endstation = endstation;
}
public String getZeit() {
return zeit;
}
public void setZeit(String zeit) {
this.zeit = zeit;
}
@Override
public String toString() {
return "Konductor{"
"id=" id
", linie='" linie '''
", endstation='" endstation '''
", zeit='" zeit '''
'}';
}
}
}
Другие варианты включают XStream или XMLBeans для абстракций более высокого уровня и dom4j или JDOM для абстракций более низкого уровня — вам придется проделать больше работы с ними, но у вас будет намного больше гибкости.
Комментарии:
1. Два момента: JAXB не работает на Android, а Simple XML — лучший фреймворк для этой работы на Android IMO.