3 Stimmen

Benutzerdefiniertes SOAP/XML in Objekte deserialisieren

Ich habe diese Xml/Soap von einem Sharepoint-Webservice-Aufruf:

<GetAllUserCollectionFromWeb xmlns="http://schemas.microsoft.com/sharepoint/soap/directory/">
<Users>
    <User ID="ID" Sid="ID" Name="XXX" LoginName="XXX" Email="XXX" Notes="" IsSiteAdmin="False" IsDomainGroup="False" Flags="0" /> 
    <User ID="ID" Sid="ID" Name="XXX" LoginName="XXX" Email="XXX" Notes="" IsSiteAdmin="False" IsDomainGroup="False" Flags="0" /> 
    <User ID="ID" Sid="ID" Name="XXX" LoginName="XXX" Email="XXX" Notes="" IsSiteAdmin="False" IsDomainGroup="False" Flags="0" /> 
    <User ID="ID" Sid="ID" Name="XXX" LoginName="XXX" Email="XXX" Notes="" IsSiteAdmin="False" IsDomainGroup="False" Flags="0" /> 
    <User ID="ID" Sid="ID" Name="XXX" LoginName="XXX" Email="XXX" Notes="" IsSiteAdmin="False" IsDomainGroup="False" Flags="0" /> 
    <User ID="ID" Sid="ID" Name="XXX" LoginName="XXX" Email="XXX" Notes="" IsSiteAdmin="False" IsDomainGroup="False" Flags="0" /> 
    <User ID="ID" Sid="ID" Name="XXX" LoginName="XXX" Email="XXX" Notes="" IsSiteAdmin="False" IsDomainGroup="False" Flags="0" /> 
</Users>

Ich möchte dieses Objekt in eine List<> des Objekts deserialisieren:

public class Person
{
    public string ID { get; set; }
    public string Sid { get; set; }
    public string Name { get; set; }
    public string LoginName { get; set; }
    public string Email { get; set; }
    public string Notes { get; set; }
    public string IsSiteAdmin { get; set; }
    public string IsDomainGroup { get; set; }
    public string Flags { get; set; }
}

Ich habe versucht, xpath zu verwenden, aber es funktioniert nicht!

        XDocument result = XDocument.Parse(e.Result.ToString());
        IEnumerable<XElement> ele = result.XPathSelectElements("/def:GetAllUserCollectionFromWeb/def:Users/def:User");

Fehler:

Namespace Manager or XsltContext needed. This query has a prefix, variable, or user-defined function.

Was ist falsch oder wie kann ich das Problem lösen?

3voto

Johann Blais Punkte 9221

Fügen Sie einen Namespace-Manager zu Ihrer Abfrage hinzu.

XDocument result = XDocument.Parse(e.Result.ToString());

XmlNamespaceManager nsManager = new XmlNamespaceManager(new NameTable());
XNamespace namespace = result.Root.GetDefaultNamespace();
nsManager.AddNamespace("def", namespace.NamespaceName);

IEnumerable<XElement> ele = result.XPathSelectElements("/def:GetAllUserCollectionFromWeb/def:Users/def:User", nsManager);

1voto

Doobi Punkte 4852

Sie können das Tool XSD.exe verwenden, um eine Proxy-Klasse aus der XML-Datei zurückzuentwickeln. Möglicherweise können Sie auch den Sammlungstyp angeben oder die generierte Klasse bearbeiten.

http://msdn.microsoft.com/en-us/library/x6c1kb0s(VS.80).aspx

http://sharpertutorials.com/using-xsd-tool-to-generate-classes-from-xml/

Bearbeiten: Oder verwenden Sie einfach "add service reference" oder SvcUtil.exe, um einen Proxy für den gesamten Dienst zu erstellen?

0voto

Werewolve Punkte 2328

Dies ist meine endgültige Lösung:

        result = XDocument.Parse(e.Result.ToString());

        XmlNamespaceManager nsManager = new XmlNamespaceManager(new NameTable());
        XNamespace ns = result.Root.GetDefaultNamespace();
        nsManager.AddNamespace("def", ns.NamespaceName);
        IEnumerable<XElement> users = result.XPathSelectElements("/def:GetAllUserCollectionFromWeb/def:Users/def:User", nsManager);

        foreach (XElement u in users)
        {
            persons.Add(new Person()
            {
                ID = u.Attribute("ID").Value,
                LoginName = u.Attribute("LoginName").Value
            });
        }

Vielen Dank für Ihre Hilfe!

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X