Использование C # и XDocument / XElement для анализа ответа мыла - PullRequest
5 голосов
/ 23 апреля 2009

Вот пример ответа мыла от моего SuperDuperService:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <soap:Body>
        <MyResponse xmlns="http://mycrazyservice.com/SuperDuperService">
            <Result>32347</Result> 
        </MyResponse>
    </soap:Body>
</soap:Envelope>

По какой-то причине, когда я пытаюсь схватить Потомка или Элемент "Результата", я получаю нулевое значение. Это как-то связано с пространством имен? Может ли кто-нибудь предоставить решение для получения Результата из этого?

Ответы [ 4 ]

11 голосов
/ 23 апреля 2009

Возможно, вы захотите попробовать что-то вроде этого:

string myNamespace= "http://mycrazyservice.com/SuperDuperService";

var results = from result in yourXml.Descendants(XName.Get("MyResponse", myNamespace))
              select result.Element("Result").value

На этом ноутбуке нет VS, поэтому я не могу дважды проверить свой код, но он должен указывать правильное направление, используя LINQ to SQL.

4 голосов
/ 18 февраля 2014

для расширения ответа Джастина проверенным кодом с возвратом, который ожидает логическое значение и что ответ и результат начинаются с имени метода (кстати, даже удивительно, что элемент XML не показывает NS, который ему требуется при разборе) :

    private string ParseXml(string sXml, string sNs, string sMethod, out bool br)
    {
        br = false;
        string sr = "";
        try
        {
            XDocument xd = XDocument.Parse(sXml);

            if (xd.Root != null)
            {
                XNamespace xmlns = sNs;
                var results = from result in xd.Descendants(xmlns + sMethod + "Response")
                              let xElement = result.Element(xmlns + sMethod + "Result")
                              where xElement != null
                              select xElement.Value;
                foreach (var item in results)
                    sr = item;
                br = (sr.Equals("true"));
                return sr;
            }
            return "Invalid XML " + Environment.NewLine + sXml;
        }
        catch (Exception ex)
        {
            return "Invalid XML " + Environment.NewLine + ex.Message + Environment.NewLine + sXml;
        }
    }
1 голос
/ 18 января 2014

Вы ищете в правильном направлении, это определенно связано с пространством имен.

Приведенный ниже код возвращает первый найденный элемент для комбинации пространства имен и имени элемента.

XDocument doc = XDocument.Load(@"c:\temp\file.xml");
XNamespace ns = @"http://mycrazyservice.com/SuperDuperService";
XElement el = doc.Elements().DescendantsAndSelf().FirstOrDefault( e => e.Name == ns + "Result");
1 голос
/ 23 апреля 2009

Может быть так:

IEnumerable<XElement> list = doc.Document.Descendants("Result");
if (list.Count() > 0)
{
    // do stuff
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...