WedX - журнал о программировании и компьютерных науках

Как перемещаться по XML-документу с помощью C# (XNamespace/XElement)

У меня возникли проблемы с извлечением нужного элемента в приложении C# для Windows Phone 8, которое извлекает потоки данных YouTube. XML-документ показан ниже. Это из плейлиста YouTube:

<entry gd:etag="W/&quot;YDwqeyM.&quot;" xmlns:gd="https://schemas.google.com/g/2005" xmlns="https://www.w3.org/2005/Atom">
  <media:group xmlns:media="https://search.yahoo.com/mrss/">
    <media:category label="Science &amp; Technology" scheme="https://gdata.youtube.com/schemas/2007/categories.cat">Tech</media:category>
    <media:content url="https://www.youtube.com/v/vt7PLhQKYlU?version=3&amp;f=playlists&amp;app=youtube_gdata" type="application/x-shockwave-flash" medium="video" isDefault="true" expression="full" duration="1668" yt:format="5" xmlns:yt="https://gdata.youtube.com/schemas/2007" />
    <media:content url="rtsp://r5---sn-p5qlsu7d.c.youtube.com/CiULENy73wIaHAlVYgoULs_evhMYDSANFEgGUglwbGF5bGlzdHMM/0/0/0/video.3gp" type="video/3gpp" medium="video" expression="full" duration="1668" yt:format="1" xmlns:yt="https://gdata.youtube.com/schemas/2007" />
    <media:content url="rtsp://r5---sn-p5qlsu7d.c.youtube.com/CiULENy73wIaHAlVYgoULs_evhMYESARFEgGUglwbGF5bGlzdHMM/0/0/0/video.3gp" type="video/3gpp" medium="video" expression="full" duration="1668" yt:format="6" xmlns:yt="https://gdata.youtube.com/schemas/2007" />
    <media:credit role="uploader" scheme="urn:youtube" yt:display="TheDigitalDigest" yt:type="partner" xmlns:yt="https://gdata.youtube.com/schemas/2007">thedigitaldigest</media:credit>
    <media:description type="plain">Surface 2</media:description>
    <yt:videoid xmlns:yt="https://gdata.youtube.com/schemas/2007">vt7PLhQKYlU</yt:videoid>
  </media:group>
</entry>

Мне нужно изменить приведенный ниже код, который анализирует запись с помощью методов XNamespace/XElement для поиска элемента yt:video вместо элемента id . Я могу без проблем добраться до элементов, которые не имеют префикса пространства имен (те, которые не содержат двоеточие). Вот код, который мне нужно изменить:

public YouTubeVideo(XNamespace atomns, XElement entry, XNamespace medians)
    {
        var id = entry.Element(atomns.GetName("id")) != null && entry.Element(atomns.GetName("id")).Value != null
            ? entry.Element(atomns.GetName("id")).Value.Split(':').Last()
            : string.Empty;
        VideoUrl = "https://gdata.youtube.com/feeds/api/videos/" + id;
    }

Обратите внимание: я нашел этот пост SO, в котором говорится о пространствах имен:

Использование LINQ to XML для обработки XML в нескольких пространствах имен

Меня беспокоит то, что, возможно, есть способ извлечь yt:videoid из XML без жесткого кодирования пространства имен yt в код, поскольку yt strong> находится прямо внутри элемента yt:videoid как атрибут xmlns. Есть ли метод, который выбирает узел пространства имен, который имеет ссылку на пространство имен в качестве атрибута? Если нет, то как правильно выбрать пространство имен из элемента, который несет его в качестве атрибута, и получить доступ к содержимому элемента пространства имен?

ОБНОВЛЕНИЕ: Чтобы обойти текущую проблему, я использую код ниже. Я все еще хотел бы узнать о решении, которое не игнорирует пространства имен, как это делает приведенный ниже код:

string videoid = (from child in entry.Descendants()
                      where child.Name.LocalName == "videoid"
                      select child.Value).FirstOrDefault();

ОБНОВЛЕНИЕ: теперь у меня есть запрос в стиле XPath, который не игнорирует работающие пространства имен, но он кажется немного многословным, и я хотел бы, чтобы кто-нибудь предложил более оптимизированный метод, если он есть. Я знаю, что мог бы добавить тернарные операторы, но вместо этого мне интересно, есть ли способ объединить разрешения пространства имен и выбор элемента?:

        // Get the namespaces for the "media" group, since it contains the "yt" group,
        //  and for the "yt" group itself.
        XNamespace xnsMediaGroup = entry.GetNamespaceOfPrefix("media");
        XNamespace xnsYouTube = entry.GetNamespaceOfPrefix("yt");

        // Got valid namespace references?
        if ((xnsMediaGroup != null) && (xnsYouTube != null))
        {
            // Yes.  Select the media group element.
            XElement xelemMediaGroup = entry.Element(xnsMediaGroup.GetName("group"));

            if (xelemMediaGroup != null)
            {
                // Select the YouTube videoid element.
                XElement xelemYTVideoId = xelemMediaGroup.Element(xnsYouTube.GetName("videoid"));

                if (xelemYTVideoId != null)
                    // Return the video's ID.
                    videoid = xelemYTVideoId.Value;
            }
        }

Ответы:


Новые материалы

Как проанализировать работу вашего классификатора?
Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

Работа с цепями Маркова, часть 4 (Машинное обучение)
Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

Учебные заметки: создание моего первого пакета Node.js
Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

ИИ в аэрокосмической отрасли
Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


Для любых предложений по сайту: [email protected]