Десериализация пользовательских SOAP / XML для объектов - PullRequest
3 голосов
/ 18 октября 2010

У меня есть этот xml / soap от вызова веб-службы sharepoint:

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

Я хочу десериализовать это в список <> этого объекта:

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

Я пытался использовать xpath, но он не работает!

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

Ошибка:

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

Что не так или как я могу решить проблему?

Ответы [ 3 ]

3 голосов
/ 18 октября 2010

Добавьте к вашему запросу менеджер пространства имен.

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);
1 голос
/ 18 октября 2010

Вы можете использовать инструмент XSD.exe для обратного проектирования прокси-класса из XML.Вы также можете указать тип коллекции или отредактировать сгенерированный класс.

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

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

Редактировать: или просто использовать «добавить сервис»reference ", или SvcUtil.exe для генерации прокси для всего сервиса?

0 голосов
/ 18 октября 2010

Это мое окончательное решение:

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

Спасибо за помощь!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...