Выполнять операции linq-to-XML без пространства имен - PullRequest
2 голосов
/ 08 апреля 2011

У меня много такого кода в одном из моих проектов (до того, как я знал, как использовать возвращение доходности):

    public EditorialReviewDTO[] GetEditorialReviews(string URL) {
        XDocument xml = XDocument.Load(URL);
        XNamespace ns = xml.Root.Name.NamespaceName;
        List<EditorialReviewDTO> result = new List<EditorialReviewDTO>();

        List<XElement> EdRevs = xml.Descendants(ns + "EditorialReview").ToList();
        for (int i = 0; i < EdRevs.Count; i++) {
            XElement el = EdRevs[i];
            result.Add(new EditorialReviewDTO() { Source = XMLHelper.getValue(el, ns, "Source"), Content = Clean(XMLHelper.getValue(el, ns, "Content")) });
        }

        return result.ToArray();
    }

    public static string getValue(XElement el, XNamespace ns, string name) {
        if (el == null) return String.Empty;

        el = el.Descendants(ns + name).FirstOrDefault();
        return (el == null) ? String.Empty : el.Value;
    }

У меня вопрос: есть ли способ выполнить эти запросы без необходимости обойти пространство имен? Есть ли способ сказать xml.Descendants("EditorialReview") и заставить его работать, даже если к этому элементу прикреплено пространство имен?

Излишне говорить, что я не могу контролировать возвращаемый формат XML.

1 Ответ

1 голос
/ 08 апреля 2011

Нет, Descendants("EditorialReview") выбирает элементы с локальным именем EditorialReview без пространства имен, поэтому call не выбирает элементы, которые находятся в пространстве имен.Однако для вашего метода getValue вы можете исключить аргумент XNamespace ns и использовать вместо него public static string getValue(XElement el, XName name), а затем просто вызвать его как, например, getValue(el, ns + "Source").

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