XDocument Sprachsteuerung mit Datatable abgleichen

  • VB.NET
  • .NET (FX) 4.0

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von Westerwälder.

    XDocument Sprachsteuerung mit Datatable abgleichen

    Guten Morgen,
    möchte gerne meine Sprachsteuerung erweitern. Kann über Tapi einen Telefonanruf tätigen. Nun möchte ich gerne diesen Vorgang über die Sprachsteuerung starten können.
    Dazu müßten alle Kontakte in der Xml-Datei (grammar) vorhanden sein, und auch aktualisiert werden.
    Bisher schaut sie wie folgt aus:

    HTML-Quellcode

    1. <grammar xmlns="http://www.w3.org/2001/06/grammar"
    2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    3. xsi:schemaLocation="http://www.w3.org/2001/06/grammar
    4. http://www.w3.org/TR/speech-grammar/grammar.xsd"
    5. xml:lang="de-DE" version="1.0">
    6. <rule id="thema" scope="public">
    7. <one-of>
    8. <item>Bild</item>
    9. <item>Aus</item>
    10. <item>Kalender</item>
    11. <item>Musik</item>
    12. <item>Foto</item>
    13. <item>Zeige dich</item>
    14. <item>Hallo</item>
    15. <item>Frieda</item>
    16. <item>Wetter</item>
    17. <item>Buero</item>
    18. <item>Astronomie</item>
    19. <item>Weg</item>
    20. <item>Benzin</item>
    21. <item>Haus</item>
    22. <item>Max</item>
    23. <item>Nachrichten</item>
    24. <item>Kontakt</item>
    25. <item>Markus</item>
    26. </one-of>
    27. </rule>
    28. </grammar>


    Die Versuche die Item-Einträge mit den meiner Datatable abzugleichen, sind bisher alle gescheitert.
    Habe alle Einträge gelöscht und mit Element.add neu gesetzt.
    Dann bekome ich xmls=<Item>Irgendwas</Item> eingetragen, was dazu führt, dass der grammar-file nicht mehr akzeptiert wird.
    Gruß Markus
    Hallo,

    zeig doch mal den Code in dem du dir die "neue" grammar-Datei aus deiner Datatable zusammen baust.

    Wenn ich das richtig "rate", besteht deine neue Grammar nicht aus der vorgegebenen Struktur, sondern aus "<grammar xmlns=<item>bla</item>" und ist deshalb nicht valide, oder versteh ich dich falsch?


    LG, Acr0most
    Wenn das Leben wirklich nur aus Nullen und Einsen besteht, dann laufen sicherlich genügen Nullen frei herum. :D
    Signature-Move 8o
    kein Problem mit privaten Konversationen zu Thema XY :thumbup:
    Guten Morgen.
    Füge nachstehend meinen Code-Ansatz ein.
    xml ist für mich Neuland-

    Spoiler anzeigen


    VB.NET-Quellcode

    1. Public Sub Woerterbuch_Update()
    2. Dim Datenzeile As DataRow = Nothing
    3. Datentabelle.Rows.Clear()
    4. Dim Woerterbuch = New XDocument
    5. Dim NeuEintrag As XElement = Nothing
    6. Dim Dateizugriff As String = Pfade.System.Pfad & "Sprache_Woerterbuch.xml"
    7. Woerterbuch = XDocument.Load(Dateizugriff)
    8. 'Alle löschen
    9. For Each Wort In Woerterbuch.Elements()(0).Elements()(0).Elements()
    10. Wort.RemoveAll()
    11. Next Wort
    12. 'Löscht die Einträge, auch <one-of>, muss neu geschrieben werden
    13. NeuEintrag = CType(Woerterbuch.Elements()(0).Elements()(0).Elements(), XElement) ' Fehler: kann nicht umgewandelt werden
    14. NeuEintrag.Value = "<one-of>"
    15. NeuEintrag.Add()
    16. 'Neu Schreiben
    17. For I As Integer = 0 To Datentabelle.Rows.Count - 1
    18. Datenzeile = Datentabelle.Rows(I)
    19. NeuEintrag = CType(Woerterbuch.Elements()(0).Elements()(0).Elements()(0).Elements(), XElement)
    20. NeuEintrag.Value = Datenzeile("Wort").ToString
    21. NeuEintrag.Add()
    22. Next I
    23. Woerterbuch.Save(Dateizugriff)
    24. End Sub


    Gruß Markus
    Habe den Code umgestellt, komme aber nicht weiter.

    VB.NET-Quellcode

    1. Public Sub Woerterbuch_Update()
    2. Dim Woerterbuch = New Xml.XmlDocument
    3. Dim Dateizugriff As String = Pfade.System.Pfad & "Sprache_Woerterbuch.xml"
    4. Woerterbuch.Load(Dateizugriff)
    5. Dim Nodelist As Xml.XmlNodeList = Woerterbuch.GetElementsByTagName("one-of")
    6. If Not Nodelist Is Nothing Then
    7. For Each Eintrag As Xml.XmlNode In Nodelist
    8. Eintrag.RemoveAll()
    9. Next Eintrag
    10. 'Nach dem Löschen, sieht die XML wie folgt aus:
    11. '<?xml version="1.0" encoding="ISO-8859-1"?>
    12. '<grammar xml : lang = "de-DE" version="1.0" xsi:schemaLocation = "http://www.w3.org/2001/06/grammar http://www.w3.org/TR/speech-grammar/grammar.xsd" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.w3.org/2001/06/grammar">
    13. '<rule id = "thema" scope="public">
    14. '<one-of> </one-of>
    15. '</rule>
    16. '</grammar>
    17. ' Hinzufügen von neuen Einträgen
    18. Dim Knoten As Xml.XmlElement = Woerterbuch.DocumentElement.Item("one-of")
    19. ' Knoten wird nicht gefunden, ist Nothing
    20. For I As Integer = 0 To 10
    21. Dim Neueintrag As Xml.XmlElement = Woerterbuch.CreateElement("item")
    22. Neueintrag.InnerText = I.ToString
    23. Knoten.AppendChild(Neueintrag)
    24. Next
    25. End If
    26. Woerterbuch.Save(Dateizugriff)
    27. MsgBox("OK")
    28. End Sub


    Wieso wird das Element one-of nicht mehr gefunden?
    Gruß Markus

    Westerwälder schrieb:

    Wieso wird das Element one-of nicht mehr gefunden?



    Ich würde schätzen, dass du dein XML Lädst und auf one-of selektierst. Diese Node ist allerdings noch innerhalb der rule-Tags.

    Versuche erst die rule zu selektieren und danach davon die one-of.

    Da du ja auch im alten Code mit For Each Wort In Woerterbuch.Elements()(0).Elements()(0).Elements() eine ebene weiter gehst. :)

    LG, Acr0most
    Wenn das Leben wirklich nur aus Nullen und Einsen besteht, dann laufen sicherlich genügen Nullen frei herum. :D
    Signature-Move 8o
    kein Problem mit privaten Konversationen zu Thema XY :thumbup:
    Danke Dir,
    nun kann ich richtig zugreifen.

    VB.NET-Quellcode

    1. ' Hinzufügen von neuen Einträgen
    2. Dim TopKnoten As Xml.XmlElement = Woerterbuch.DocumentElement.Item("rule")
    3. Dim Knoten As Xml.XmlElement = TopKnoten.Item("one-of")
    4. For I As Integer = 0 To 10
    5. Dim Neueintrag As Xml.XmlElement = Woerterbuch.CreateElement("item")
    6. Neueintrag.InnerText = I.ToString
    7. Knoten.AppendChild(Neueintrag)
    8. Next I


    Jedoch bleibt noch das Problem mit dem xmls vor dem Eintrag:
    <item xmlns="">0</item>
    Wie bekomme ich dieses noch weg?
    Gruß Markus
    Stört das denn?

    der xmlns ist nur ein Namespace. Musst halt ggf. nen Namespace nehmen, den du für angebracht hältst. zum Beispiel:
    Woerterbuch.CreateElement("item", Woerterbuch.DocumentElement.NamespaceURI);


    LG, Acr0most
    Wenn das Leben wirklich nur aus Nullen und Einsen besteht, dann laufen sicherlich genügen Nullen frei herum. :D
    Signature-Move 8o
    kein Problem mit privaten Konversationen zu Thema XY :thumbup:
    Lade ich die neu erstellte Datei erhalte ich die Fehlermeldung
    "one-of" muss mindestens ein "item"-Element enthalten.

    Offensichtlich wird nur ein <item>Irgendwas</item> akzeptiert.
    Welcher Namespace ist da der richtige?
    Wie gesagt, xml habe ich bis dato nur mit datatable genutzt.
    Gruß Markus