2017-08-22 97 views
0
<?xml version="1.0" encoding="UTF-8"?> 
<message xmlns="jabber:client" to="[email protected]/unityXMPP" type="chat" xml:lang="en" from="[email protected]/unityXMPP"> 
    <archived xmlns="urn:xmpp:mam:tmp" id="1503375414608430" by="[email protected]" /> 
    <stanza-id xmlns="urn:xmpp:sid:0" id="1503375414608430" by="[email protected]" /> 
    <body>hi</body> 
</message> 

我想解析內部XML以獲取id屬性。 我已經創建了任何我發現的命名空間。我能夠從屬性中獲得。以下是c#中的代碼。解析XMPP內部xml

string value = "<message xmlns=\"jabber:client\" to=\"[email protected]/unityXMPP\" type=\"chat\" xml:lang=\"en\" from=\"[email protected]/unityXMPP\"><archived xmlns=\"urn:xmpp:mam:tmp\" id=\"1503375414608430\" by=\"[email protected]\" /><stanza-id xmlns=\"urn:xmpp:sid:0\" id=\"1503375414608430\" by=\"[email protected]\" /><body>hi</body></message>"; 

    XmlDocument xmlDoc = new XmlDocument(); 
    XmlNamespaceManager namespaces = new XmlNamespaceManager (xmlDoc.NameTable); 
    namespaces.AddNamespace ("ns", "jabber:client"); 
    namespaces.AddNamespace ("ns1", "urn:xmpp:mam:tmp"); 
    xmlDoc.LoadXml (value); 
    XmlNode messageNode = xmlDoc.SelectSingleNode ("/ns:message", namespaces); 
    string sender = messageNode.Attributes ["from"].Value; 
    string receiver = messageNode.Attributes ["to"].Value; 
    string message = messageNode.InnerText; 
    XmlNode timeStampNode = xmlDoc.SelectSingleNode ("/ns:message/ns1:archived"); 
    string timestamp = timeStampNode.Attributes ["id"].Value; 
+0

那麼,什麼是你的問題? – Programmer

+0

如前所述,我需要解析的內部XML在我現有的代碼,我去取id屬性 –

回答

0

這有幫助嗎?我使用LINQ到XML

string xmltext = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><message xmlns=\"jabber:client\" to=\"[email protected]/unityXMPP\" type=\"chat\" xml:lang=\"en\" from=\"[email protected]/unityXMPP\"> <archived xmlns=\"urn:xmpp:mam:tmp\" id=\"1503375414608430\" by=\"[email protected]host\" /> <stanza-id xmlns=\"urn:xmpp:sid:0\" id=\"1503375414608430\" by=\"[email protected]\" /> <body>hi</body></message>"; 
var xdoc = XDocument.Parse(xmltext); 
foreach (var item in xdoc.Root.Descendants()) 
{ 
    if (item.Name.LocalName == "archived") 
    Console.WriteLine(item.Attribute("id").Value);     
} 
+0

謝謝,它按預期工作。只是好奇,如果你可以在現有的代碼中指出問題。 接受此爲解決方案。 –

+0

您必須指定當你做這樣的的SelectSingleNode的命名空間 - XmlNode的timeStampNode = xmlDoc.SelectSingleNode( 「/ NS:消息/ NS1:歸檔」,命名空間);這將使你的代碼工作 – Avenger789

0

這是更好地使用XPath,如果你不想去/序列化XML到一個對象(Link)。

或者您可以使用序列化,這是一種在您的解決方案中使用json或xml的非常簡單的方法(Link 1,Link 2)。

+0

嘿亞歷克斯, 我相信問題來了,由於命名空間issues.I我都知道你提到的辦法,其實我已經在使用XPath方法。 –

+0

也許,但您可以過濾所有屬性或值。 –

0

嘗試下面的XML LINQ來獲取所有數據

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); 

      var message = doc.Descendants().Where(x => x.Name.LocalName == "message").Select(x => new { 
       to = (string)x.Attribute("to"), 
       type = (string)x.Attribute("type"), 
       lang = (string)x.Attributes().Where(y => y.Name.LocalName == "lang").FirstOrDefault(), 
       from = (string)x.Attribute("from"), 
       messages = x.Elements().Select(y => new { 
        name = y.Name.LocalName, 
        id = (string)y.Attribute("id"), 
        by = (string)y.Attribute("by"), 
        value = (string)y 
       }).ToList() 
      }).FirstOrDefault(); 
     } 
    } 
}