XDocument анализирует, но не доступен для поиска из строки - PullRequest
1 голос
/ 04 февраля 2010

Я получаю строку с веб-сайта, которая выглядит следующим образом

<?xml version=\"1.0\" encoding=\"UTF-8\"?><searchResponse requestID=\"500\" status=\"success\"><pso><psoID ID=\"61F2C644-F93A-11DE-8015-73A11AB14291\" targetID=\"mezeoAccount\"><data><email>sholobfc@bluefire.com.au</email><quotaMeg>2048</quotaMeg><quotaUsed>1879736</quotaUsed><active>true</active><unlocked>true</unlocked><allowPublic>true</allowPublic><realm>mezeo</realm><bandwidthQuota>1000000000</bandwidthQuota><billingDay>1</billingDay></data></psoID></pso></searchResponse>"

Затем я пытаюсь создать из него XDocument, чтобы можно было перечислять элементы

XDocument doc = new XDocument();
doc = XDocument.Parse(respStr);

но если я каждый раз запрашиваю элементы или потомков, возвращается ноль. Я не могу пойти

string s = doc.Element("email").Value;
// or
doc.Descendants("data"); // returns null as well

XDocument.Parse не возвращает ошибку, но у меня, похоже, нет доступного для поиска xDocument.

Может кто-нибудь увидеть что-то явно не так с тем, что я делаю?

1 Ответ

1 голос
/ 04 февраля 2010

Вам не нужно создавать новый XDocument перед вызовом XDocument.Parse.Это не вызовет никаких проблем, просто бессмысленно.

Однако эта строка неверна, поскольку электронная почта не является дочерней по отношению к корню документа:

doc.Element("email").Value;

Ваш второй пример выглядит хорошо.Это работает для меня:

string s = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><searchResponse requestID=\"500\" status=\"success\"><pso><psoID ID=\"61F2C644-F93A-11DE-8015-73A11AB14291\" targetID=\"mezeoAccount\"><data><email>sholobfc@bluefire.com.au</email><quotaMeg>2048</quotaMeg><quotaUsed>1879736</quotaUsed><active>true</active><unlocked>true</unlocked><allowPublic>true</allowPublic><realm>mezeo</realm><bandwidthQuota>1000000000</bandwidthQuota><billingDay>1</billingDay></data></psoID></pso></searchResponse>";
XDocument doc = XDocument.Parse(s);
foreach (XElement e in doc.Descendants("data"))
    Console.WriteLine(e);

Результат:

<data>
  <email>sholobfc@bluefire.com.au</email>
  <quotaMeg>2048</quotaMeg>
  <quotaUsed>1879736</quotaUsed>
  <active>true</active>
  <unlocked>true</unlocked>
  <allowPublic>true</allowPublic>
  <realm>mezeo</realm>
  <bandwidthQuota>1000000000</bandwidthQuota>
  <billingDay>1</billingDay>
</data>

В ответ на ваш второй третий вопрос (см. Комментарии к этому ответу) попробуйте это:*

using System;
using System.Xml.XPath;
using System.Xml.Linq;

class Program
{
    public static void Main()
    {
        string xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><searchResponse requestID=\"500\" status=\"success\"><pso><psoID ID=\"61F2C644-F93A-11DE-8015-73A11AB14291\" targetID=\"mezeoAccount\"><data><email>sholobfc@bluefire.com.au</email><quotaMeg>2048</quotaMeg><quotaUsed>1879736</quotaUsed><active>true</active><unlocked>true</unlocked><allowPublic>true</allowPublic><realm>mezeo</realm><bandwidthQuota>1000000000</bandwidthQuota><billingDay>1</billingDay></data></psoID></pso></searchResponse>";
        XDocument doc = XDocument.Parse(xml);
        foreach (XElement e in doc.XPathSelectElements("/searchResponse/pso/psoID/data/*"))
                Console.WriteLine(e);
    }
}

Вывод:

<email>sholobfc@bluefire.com.au</email>
<quotaMeg>2048</quotaMeg>
<quotaUsed>1879736</quotaUsed>
<active>true</active>
<unlocked>true</unlocked>
<allowPublic>true</allowPublic>
<realm>mezeo</realm>
<bandwidthQuota>1000000000</bandwidthQuota>
<billingDay>1</billingDay>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...