2017-09-15 2 views
0

Ich bin sehr neu in XML mit C# Ich habe ein XML Ich muss durch bestimmte Kinder in der Eltern gehen Ich brauche die ID und die Variable Variablen Variablen, die ich tat, aber Jedes Mal ging nicht durch die SchleifeNachkommen in C# geben nicht den richtigen Wert

Muss ich durch alle Eltern von XML gehen, bis ich den Baum, den ich will ??

die xml

<message xmlns="jabber:client" to="[email protected]" id="/finesse/api/User/1072/[email protected]__104Y2" from="pubsub.finesse1.dcloud.cisco.com"> 
<event xmlns="http://jabber.org/protocol/pubsub#event"> 
<items node="/finesse/api/User/1072/Dialogs"> 
    <item id="460c2d27-c914-4c24-a95f-edf9f8df45c21535"> 
    <notification xmlns="http://jabber.org/protocol/pubsub"> 
     <Update> 
     <data> 
      <dialogs> 
      <Dialog> 
       <associatedDialogUri></associatedDialogUri> 
       <fromAddress>1071</fromAddress> 
       <id>18639330</id> 
       <mediaProperties> 
       <DNIS>1072</DNIS> 
       <callType>AGENT_INSIDE</callType> 
       <dialedNumber>1072</dialedNumber> 
       <outboundClassification></outboundClassification> 
       <callvariables> 
        <CallVariable> 
        <name>callVariable1</name> 
        <value></value> 
        </CallVariable> 
        <CallVariable> 
        <name>callVariable2</name> 
        <value></value> 
        </CallVariable> 
        <CallVariable> 
        <name>callVariable3</name> 
        <value></value> 
        </CallVariable> 
        <CallVariable> 
        <name>callVariable4</name> 
        <value></value> 
        </CallVariable> 
        <CallVariable> 
        <name>callVariable5</name> 
        <value></value> 
        </CallVariable> 
        <CallVariable> 
        <name>callVariable6</name> 
        <value></value> 
        </CallVariable> 
        <CallVariable> 
        <name>callVariable7</name> 
        <value></value> 
        </CallVariable> 
        <CallVariable> 
        <name>callVariable8</name> 
        <value></value> 
        </CallVariable> 
        <CallVariable> 
        <name>callVariable9</name> 
        <value></value> 
        </CallVariable> 
        <CallVariable> 
        <name>callVariable10</name> 
        <value></value> 
        </CallVariable> 
       </callvariables> 
       </mediaProperties> 
       <mediaType>Voice</mediaType> 
       <participants> 
       <Participant> 
        <actions> 
        <action>ANSWER</action> 
        </actions> 
        <mediaAddress>1072</mediaAddress> 
        <mediaAddressType>AGENT_DEVICE</mediaAddressType> 
        <startTime>2017-09-15T19:23:36.872Z</startTime> 
        <state>ALERTING</state> 
        <stateCause></stateCause> 
        <stateChangeTime>2017-09-15T19:23:36.872Z</stateChangeTime> 
       </Participant> 
       <Participant> 
        <actions> 
        <action>UPDATE_CALL_DATA</action> 
        <action>DROP</action> 
        </actions> 
        <mediaAddress>1071</mediaAddress> 
        <mediaAddressType>AGENT_DEVICE</mediaAddressType> 
        <startTime>2017-09-15T19:23:36.609Z</startTime> 
        <state>INITIATED</state> 
        <stateCause></stateCause> 
        <stateChangeTime>2017-09-15T19:23:36.819Z</stateChangeTime> 
       </Participant> 
       </participants> 
       <state>ALERTING</state> 
       <toAddress>1072</toAddress> 
       <uri>/finesse/api/Dialog/18639330</uri> 
      </Dialog> 
      </dialogs> 
     </data> 
     <event>POST</event> 
     <requestId></requestId> 
     <source>/finesse/api/User/1072/Dialogs</source> 
     </Update> 
    </notification> 
    </item> 
</items> 
</event> 
</message> 

, die dem -Code ist

XElement xmlroots = XElement.Parse(parsingNewXML); 
//Dialog = xmlroots.Element("Dialog").Value; 
var CallVariable = parsingNewXML.Contains("CallVariable"); 
var startCall = parsingNewXML.Contains("ALERTING"); 

if (CallVariable == true && startCall == true) 
{ 

    foreach (XElement callID in xmlroots.Descendants("Dialog")) 
    { 
     DialogID = callID.Element("id").Value; 
     //System.Windows.MessageBox.Show(DialogID); 
     System.Windows.Application.Current.Dispatcher.BeginInvoke(
     DispatcherPriority.Background, 
     new Action(() => ((MainWindow)System.Windows.Application.Current.MainWindow).answerCall.Visibility = Visibility.Visible)); 
    } 
    foreach (XElement callVariables in xmlroots.Descendants("CallVariables")) 
    { 
     foreach (XElement callVariable in xmlroots.Descendants("CallVariable")) 
     { 
      list = callVariable.Element("value").Value; 
     } 
    } 
    // state = second.Element("state").Value; 
} 
+0

Ihr Code und das XML sind nicht konsistent. Ich kann nicht sagen, was du brauchst. Die "if" -Klausel ergibt keinen Sinn. Keine Ahnung, worauf sich parsingmsg bezieht. Es ist viel einfacher, Nachkommen anstelle von Vorfahren zu verwenden. – jdweng

+0

@jdweng bitte helfen Sie mir Ich möchte die ID von diesem XML bekommen was soll ich tun Ich weiß nicht, was ist der Code zu schreiben, um die ID zu bekommen Ich versuchte diesen Code, aber hat mir nicht geholfen – bavs

Antwort

5

Das erste Problem ist, dass Sie nur Descendants("Dialog") nennen, Descendants("CallVariables") usw. Diejenigen, sucht Elemente im globalen Namespace - aber alle Elemente Sie suchen sind tatsächlich in einem Namensraum von http://jabber.org/protocol/pubsub Aus diesem Grund:

<notification xmlns="http://jabber.org/protocol/pubsub"> 

Wenn Sie xmlns="..." sehen, die den Standard-Namespace für alle Nachkommen setzt. Dieser Standardwert kann explizit durch Elementnamen überschrieben werden, die einen Namespace angeben - oder er kann von einem anderen Nachkommen mit xmlns=... geändert werden. (Ihr Dokument enthält mehrere Ebene von den Vorgaben.)

Glücklicherweise LINQ to XML macht es einfach, Namespaces angeben, aufgrund der impliziten Konvertierung von string zu XNamespace und die XName +(XNamespace, string) Betreiber:

XDocument doc = XDocument.Parse(...); 
XNamespace pubsub = "http://jabber.org/protocol/pubsub"; 
// Find all the descendants with a local name of "Dialog" in the 
// namespace specified by the pubsub variable 
foreach (XElement dialog in doc.Descendants(pubsub + "Dialog")) 
{ 
    ... 
} 

Als zweite Ausgabe, Blick auf diese zweite Schleife:

foreach (XElement callVariables in xmlroots.Descendants("CallVariables")) 
{ 
    foreach (XElement callVariable in xmlroots.Descendants("CallVariable")) 
    { 
     list = callVariable.Element("value").Value; 
    } 
} 

Es gibt drei Probleme:

  • In Ihrem Dokument gibt es keine Elemente mit der Bezeichnung CallVariables - stattdessen gibt es callvariables. XML unterscheidet zwischen Groß- und Kleinschreibung.
  • Ich bin sicher, dass Sie nicht möchten, die Kombination von jede Aufrufvariable in alle Aufruf Variablen Element.Stattdessen würde ich so etwas wie erwartet:

    foreach (var callVariables in doc.Descendants(pubsub + "callvariables")) 
    { 
        // Note use of Elements, not Descendants. You still need 
        // the namespace part though... 
        foreach (var callVariable in callVariables.Elements(pubsub + "CallVariable")) 
        { 
         // Do what you want 
        } 
    } 
    
  • Derzeit sind Sie nur Ersatz der list Variable im Körper der Schleife, die nur die letzte Iteration der Schleife bedeutet, ist tatsächlich nützlich.

Es auch viele andere Dinge falsch mit dem Code sein kann - scheint es seltsam, die XML zu analysieren und dann prüfen, ob die Zeichenfolge Darstellung, die eine bestimmte Zeichenfolge enthält (und nicht für die Existenz eines bestimmten Elements Überprüfung zum Beispiel), aber diese sollten dich beginnen.

+0

danke für deine antwort das, was ich gesucht habe, wusste ich nicht über namespace danke viel für die erklärung auch Bitte können sie mir sagen, warum gibt mir jemand geben -ve in der frage mich das nächste mal zu verbessern – bavs

0

Ich bin nicht sicher, was Sie wirklich wollen, aber diese extrahiert die IDs und die callvariables auf eine Liste von Dialogobjekt. Wenn Sie ling-to-xml verwenden möchten, müssen Sie zunächst ein XDocument analysieren und anschließend die gewünschten Nachkommen durchlaufen. Abschließend holen Sie sich die Werte aus den Aufrufvariablen mit einer anderen Schleife.

Vergessen Sie nicht, sich am Ende über die Ausnahme Gedanken zu machen.

 public class Dialog 
     { 
      public int id; 
      public List<CallVariable> callVariables = new List<CallVariable>(); 
      public struct CallVariable 
      { 
       public string name; 
       public string value; 
      } 

     } 

     public List<Dialog> GetDialogsFromXml(string xml) 
     { 
      try 
      { 
       XDocument doc = XDocument.Parse(xml); 
       List<Dialog> dialogs = new List<Dialog>(); 

       foreach (XElement item in doc.Root.Descendants("{http://jabber.org/protocol/pubsub}Dialog")) 
       { 

        int dialogid = int.Parse(item.Element("{http://jabber.org/protocol/pubsub}id").Value); 

        List<Dialog.CallVariable> callvariables = new List<Dialog.CallVariable>(); 

        foreach (XElement callVariableNode in item.Descendants("{http://jabber.org/protocol/pubsub}callvariables").FirstOrDefault().Descendants("{http://jabber.org/protocol/pubsub}CallVariable")) 
        { 
         callvariables.Add(new Dialog.CallVariable() { name=callVariableNode.Element("{http://jabber.org/protocol/pubsub}name").Value, value = callVariableNode.Element("{http://jabber.org/protocol/pubsub}value").Value }); 
        } 

        dialogs.Add(new Dialog() { id = dialogid, callVariables = callvariables }); 

       } 
       return dialogs; 
      } 
      catch (Exception e) 
      { 
       //handle if something goes wrong 
       return null; 

      } 

     } 
-1

Verwenden Sie XML linq. Sie müssen auch den Namespace verwenden, um die Elemente zu erhalten. Sie können den Namespace umgehen, indem Sie den LocalName wie für Dialoge abrufen. :

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Xml; 
using System.Xml.Linq; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     const string FILENAME = @"c:\temp\test.xml"; 
     static void Main(string[] args) 
     { 
      XDocument doc = XDocument.Load(FILENAME); 

      XElement dialogs = doc.Descendants().Where(x => x.Name.LocalName == "dialogs").FirstOrDefault(); 
      XNamespace ns = dialogs.GetDefaultNamespace(); 

      var results = dialogs.Elements(ns + "Dialog").Select(x => new { 
       id = (int)x.Element(ns + "id"), 
       associatedDialogUri = (string)x.Element(ns + "associatedDialogUri"), 
       fromAddress = (string)x.Element(ns + "fromAddress"), 
       dnis = (int)x.Descendants(ns + "DNIS").FirstOrDefault(), 
       callType = (string)x.Descendants(ns + "callType").FirstOrDefault(), 
       dialedNumber = (int)x.Descendants(ns + "dialedNumber").FirstOrDefault(), 
       outboundClassification = (string)x.Descendants(ns + "outboundClassification").FirstOrDefault(), 
       callVariables = x.Descendants(ns + "CallVariable").Select(y => new { 
        name = (string)y.Element(ns + "name"), 
        value = (string)y.Element(ns + "value") 
       }).ToList(), 
       participants = x.Descendants(ns + "Participant").Select(y => new 
       { 
        actions = y.Descendants(ns + "action").Select(z => (string)z).ToList(), 
        namemediaAddress = (int)y.Element(ns + "mediaAddress"), 
        mediaAddressType = (string)y.Element(ns + "mediaAddressType"), 
        startTime = (DateTime)y.Element(ns + "startTime"), 
        state = (string)y.Element(ns + "state"), 
        stateCause = (string)y.Element(ns + "stateCause"), 
        stateChangeTime = (DateTime)y.Element(ns + "stateChangeTime") 
       }).ToList(), 
       state = (string)x.Descendants(ns + "state").FirstOrDefault(), 
       toAddress = (int)x.Descendants(ns + "toAddress").FirstOrDefault(), 
       uri = (string)x.Descendants(ns + "uri").FirstOrDefault() 

      }).ToList(); 

     } 
    } 
} 
+2

Nur Code ohne Erklärung isn Es ist fast so hilfreich wie eine gründliche Erklärung, was Sie geändert haben und warum. –

+0

Ein Bild ist 1000 Worte wert. Code mit guten Variablen Namen, leicht zu lesen und gut organisiert ist besser als 1.000.000.000 Wörter. Jetzt mussten Sie die Anzahl der Nullen zählen, um zu wissen, dass die Zahl eine Milliarde war, oder sollte ich Milliarden anstelle der Ziffern 0 und 1 verwenden. Denken Sie, dass mein Code Kommentare benötigt? Was für Kommentare? Es ist besser, den Code zu dokumentieren und dann eine Erklärung zu schreiben. Das Auswählen von guten Variablennamen kann die Notwendigkeit von Kommentaren überflüssig machen. – jdweng

+1

Ich habe nicht nach Kommentaren gefragt. Ich bat um eine Erklärung. Sie haben * keine * Erklärung dafür gegeben, warum Sie sich beispielsweise um einen Namespace kümmern müssen, was der wichtigste Aspekt ist. (Ich frage mich auch, wie Sie den ersten Namespace * übernehmen * was, wenn das Dokument später andere 'Dialogelemente' in verschiedenen Namespaces enthält?) –

Verwandte Themen