Java Android Studio: Ansprechen und benutzen einer benutzerdefinierten XML-Datei

fanatiXalpha

Fleet Admiral
Dabei seit
Aug. 2011
Beiträge
12.596
Servus Leute,

schon mal vorab:
1. es geht hier NICHT um eine XML-Datei die ein Layout definieren soll.

2. habe ich nicht all zu viel Erfahrung in Android Studio, aber etwas in Java

Es geht um eine App die per Bluetooth CAN-Nachrichten eines Piaggio Porters ausliest.
Das Grundgerüst steht schon, die Nachrichten kommen rein und können auch verarbeitet werden.
Die XML-Datei soll jetzt dazu dienen schnell und unkompliziert neue Nachrichten in der App anzeigen zu können.
Es ist also eine CAN-Liste welche die Nachrichten beschreibt usw.

Das Problem vor dem ich jetzt zunächst stehe ist: wie spreche ich die einzelnen Elemente, also die CAN-Nachrichten, in dieser XML an?

Die XML sieht so aus (ist nicht die ganze Datei, nur ein Beispielteil:
Code:
<resources>
    <item type="id" name="canlist_messages">
        <message id="2" name="emergency stop" cycletime="50" length="1">
            <byte0 name="emergency_stop_state">
                <item value="0">not actuated</item>
                <item value="1">actuated</item>
            </byte0>
            <details>If byte0 is 0, emergency stop is not activated. Else it is.</details>
        </message>
usw.
Die Datei an sich kann ich ja über R.id.canlist_messages ansprechen.

Nur komm ich nicht weiter, wie ich nun explizit die Nachricht mit der ID=2 komme.

Also von der App kriege ich die ID und den Inhalt. Und mit der ID muss ich dann in der Liste an die richtige Stelle springen. Aber wie sieht der Syntax dafür aus?
Den richtigen Zustand (also abhängig vom Inhalt) auswählen dürfte wahrscheinlich so ähnlich ablaufen.


Hoffe ihr könnt mir da in egal welcher Weise etwas weiterhelfen.
Im Internet bin ich nicht so wirklich fündig geworden, weil XML bei Android Studio meist mit Layout zu tun hat wo es von Android Studio ja schon Richtlinien und vorgefertige Sachen gibt...

Im Beitrag #6 ist meine aktuelle Frage aufgeführt zu dem Thema

Danke :)


Falls ihr noch weitere Infos benötigt fragt einfach.
 
Zuletzt bearbeitet:

belafarinrod91

Lt. Junior Grade
Dabei seit
Apr. 2010
Beiträge
338
Du möchtest eine XML-Datei parsen ?
 

belafarinrod91

Lt. Junior Grade
Dabei seit
Apr. 2010
Beiträge
338
Wie meinst du ohne Umwege ? Ohne die Datei zu parsen ? Das geht afaik nicht ... es sei denn, es gibt irgendwelche krassen Bibliotheken ;-)

Hier nochmal die offizielle Quelle.
 

fanatiXalpha

Fleet Admiral
Ersteller dieses Themas
Dabei seit
Aug. 2011
Beiträge
12.596
Okay, ich hoffe es sind heute noch welche online und sehen meine weitere Frage

ich habe festgestellt, das der DOM-Parser die Wahl für ich ist, da ich keine dynamischen Inhalte über die XML einlese
der erste Schritt ist dabei ja die XML zu parsen, was mit einm Block gemacht wird, der in etwa so aussieht:
Code:
public Document getDomElement(String xml_data){
        Document doc = null;
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

        try{
            DocumentBuilder db = dbf.newDocumentBuilder();

            InputSource is = new InputSource();
            is.setCharacterStream(new StringReader(xml_data));
            doc = db.parse(is);

            doc.getDocumentElement().normalize();
            Element rootElement = doc.getDocumentElement();
            NodeList nodeList = doc.getElementsByTagName("message");
            NodeList nodeList2 = rootElement.getElementsByTagName("message");
            Log.i("INFO", "Rootelement is: " + rootElement.getTagName()+ "and the length of the Nodelist is: " + nodeList.getLength() + ", and Nodelist2 has the length: " + nodeList2.getLength());

        //ErrorHandler
        } catch (ParserConfigurationException e){
            Log.e("Error: ", e.getMessage());
            return null;
        } catch (SAXException e) {
            Log.e("Error: ", e.getMessage());
            return null;
        } catch (IOException e) {
                Log.e("Error: ", e.getMessage());
                return null;
            }

// Rückgabe des DOM (Document Object Model)
        return doc;

In den ganzen Beispielen ist dann zu sehen, dass der Inhalt der XML jeweils wieder in Variablen bzw. Arrays gespeichert wird.
Ich dachte mit dem DOM-Parser habe ich dann mein XML-Dokument schon übersetzt in Baum-Struktur im RAM liegen und kann so darauf zugreifen.
Oder geht das nicht?
Will nicht, dass ich da nachher mehr Code schreibe als eigentlich nötig.
Hoffe ihr versteht was ich meine :D
 

BigNum

Lt. Junior Grade
Dabei seit
März 2012
Beiträge
295
In den ganzen Beispielen ist dann zu sehen, dass der Inhalt der XML jeweils wieder in Variablen bzw. Arrays gespeichert wird.
Ich dachte mit dem DOM-Parser habe ich dann mein XML-Dokument schon übersetzt in Baum-Struktur im RAM liegen und kann so darauf zugreifen.
Oder geht das nicht?
Doch, natürlich geht das, es ist aber relativ umständlich und zeitaufwändig, darum extrahiert man die Daten, die man haben will und packt sie in geeignete Datenstrukturen (wie oben von Dir bereits erwähnt "Variablen bzw. Arrays" oder auch z.B. eigene Klassen).

Wenn ich Dein XML-Beispiel leicht erweitere und als "cb_1535189.xml" abspeichere:

Code:
<resources>
    <item type="id" name="canlist_messages">
        <message id="1" name="name1" cycletime="20" length="1">
            <byte0 name="name2">
                <item value="0">not actuated</item>
                <item value="1">actuated</item>
            </byte0>
            <details>detail1</details>
        </message>
        <message id="2" name="emergency stop" cycletime="50" length="1">
            <byte0 name="emergency_stop_state">
                <item value="0">not actuated</item>
                <item value="1">actuated</item>
            </byte0>
            <details>If byte0 is 0, emergency stop is not activated. Else it is.</details>
        </message>
        <message id="3" name="name3" cycletime="80" length="1">
            <byte0 name="name4">
                <item value="0">not actuated</item>
                <item value="1">actuated</item>
            </byte0>
            <details>detail2</details>
        </message>
	</item>
</resources>
und damit dieses Java-Programm füttere

Code:
import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class ReadXMLFile
{
	public static void main(String[] args)
	{
		try
		{
			File file = new File("cb_1535189.xml");
			DocumentBuilder dBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
			Document doc = dBuilder.parse(file);

			NodeList nodeList = doc.getElementsByTagName("message");
			System.out.println("found " + nodeList.getLength() + " message nodes in XML file\n");

			for(int count = 0; count < nodeList.getLength(); count++)
			{
				Node tempNode = nodeList.item(count);
				if (tempNode.getNodeType() == Node.ELEMENT_NODE)
				{
					if (tempNode.hasAttributes())
					{
						NamedNodeMap nodeMap = tempNode.getAttributes();
						Node n = nodeMap.getNamedItem("id");
						if (n.getNodeValue().equals("2"))
						{
							System.out.println("hurray! found <message> with id \"2\" !");
							System.out.println("the attributes and their values are:\n------------------------------------");
							for(int a = 0; a < nodeMap.getLength(); a++)
								System.out.println(nodeMap.item(a).getNodeName() + " = " + nodeMap.item(a).getNodeValue());
							System.out.println("\nDoes it have child nodes? " + (tempNode.hasChildNodes()?"yes":"no"));
							if (tempNode.hasChildNodes())
							{
								System.out.println("# of Children: " + tempNode.getChildNodes().getLength());
								NodeList children= tempNode.getChildNodes();
								for(int c=0; c<children.getLength(); c++)
									System.out.println( "Child#" + c + ": " + children.item(c).getNodeName());
							}
						}
					}
				}
			}
		}
		catch (Exception e)
		{
			System.out.println(e.getMessage());
		}
	}
}
erhalte ich als Ausgabe:

Code:
found 3 message nodes in XML file

hurray! found <message> with id "2" !
the attributes and their values are:
------------------------------------
cycletime = 50
id = 2
length = 1
name = emergency stop

Does it have child nodes? yes
# of Children: 5
Child#0: #text
Child#1: byte0
Child#2: #text
Child#3: details
Child#4: #text

HTH

BigNum
 

fanatiXalpha

Fleet Admiral
Ersteller dieses Themas
Dabei seit
Aug. 2011
Beiträge
12.596
Zuletzt bearbeitet:
Top