Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / [SL] Проблема с загрузкой .xaml через XElement / 5 сообщений из 5, страница 1 из 1
24.11.2010, 12:34
    #36973830
enigmatic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[SL] Проблема с загрузкой .xaml через XElement
Здравствуйте.

Столкнулся с интересной проблемой. Нужно получить список сборок из AppManifest.xaml, намереваюсь использовать XElement. Загружаю xaml, пытаюсь получить нужный узел - и XElement его не находит. Почему так?

Код: plaintext
1.
2.
XElement root = XElement.Load("AppManifest.xml");
XElement node = root.Element("Deployment.Parts"); //node is null - почему?
AppManifest.xaml
Код: plaintext
1.
2.
3.
4.
5.
<Deployment xmlns="http://schemas.microsoft.com/client/2007/deployment" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" EntryPointAssembly="TriangleApp" EntryPointType="TriangleApp.App" RuntimeVersion="4.0.50401.0">
  <Deployment.Parts>
    <AssemblyPart x:Name="TriangleApp" Source="TriangleApp.dll" />
    <AssemblyPart x:Name="TriangleClassLibrary" Source="TriangleClassLibrary.dll" />
  </Deployment.Parts>
</Deployment>

Использую SL 4.0, VS 2010.

PS. Интересный момент: убираем xmlns=" http://schemas.microsoft.com/client/2007/deployment" из AppManifest.xaml - все работает как часы.
...
Рейтинг: 0 / 0
24.11.2010, 16:25
    #36974813
LR
LR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[SL] Проблема с загрузкой .xaml через XElement
у меня вот такой рабочий код (уже не помню откуда взял), мож пригодится
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
        private AssemblyPartCollection deploymentParts(Stream xapStream)
        {
            XmlReader reader = XmlReader.Create(Application.GetResourceStream(new StreamResourceInfo(xapStream, null), 
new Uri("AppManifest.xaml", UriKind.Relative)).Stream);
            AssemblyPartCollection parts = new AssemblyPartCollection();
            if (reader.Read()) {
                reader.ReadStartElement();
                if (reader.ReadToNextSibling("Deployment.Parts")) {
                    while (reader.ReadToFollowing("AssemblyPart")) {
                        parts.Add(new AssemblyPart() { Source = reader.GetAttribute("Source") });
                    }
                }
            }
            return parts;
        }

PS. в хмл-ридерах/парсерах/сериализаторах столько "мутаций/мутантов" что разбираться с вопросом "node is null - почему?" нет никакого желания, хотя ответ может быть и прост... :)
...
Рейтинг: 0 / 0
24.11.2010, 17:20
    #36975027
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[SL] Проблема с загрузкой .xaml через XElement
Пережитки SL3.

Различия в обработке XAML между Silverlight 3 и Silverlight 4

Пространства имен XAML
Silverlight 3 налагает следующие ограничения для объявлений пространства имен XAML, отличные от Silverlight 4.

Корневой элемент обязательно должен содержать объявление пространства имен по умолчанию. Неявные значения не предполагаются.


Любое объявление пространства имен по умолчанию (в корневом элементе или нет) должно быть http://schemas.microsoft.com/winfx/2006/xaml/presentation, http://schemas.microsoft.com/client/2007 или пространством имен XPS ( http://schemas.microsoft.com/xps/2005/06), что используется редко.


Манифест приложения Silverlight технически является XAML, но его корневой элемент обычно является объектом Deployment, который, как правило, должен использовать пространство имен XAML по умолчанию xmlns=" http://schemas.microsoft.com/client/2007/deployment" для разрешения.


Silverlight 4 может также иметь подобные ограничения, но они существуют только в поведении компиляции разметки XAML для действия при построении Page, обычно не в средстве синтаксического анализа XAML, используемом во время выполнения.
...
Рейтинг: 0 / 0
25.11.2010, 09:10
    #36975993
enigmatic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[SL] Проблема с загрузкой .xaml через XElement
LR,
Спасибо, нашел примерно то же самое, но с использованием Linq.
Кстати, вариант через XmlReader лучше, потому что позволяет убрать референс на System.Xml.Linq и существенно сократить объем .xap-пакета.
Код: plaintext
1.
2.
3.
4.
5.
XElement root = XElement.Load(ManifestStream);
List<XElement> deploymentParts = (from assemblyParts in root.Elements().Elements() select assemblyParts).ToList();

listBox1.Items.Clear();
foreach (XElement assembly in deploymentParts)
    listBox1.Items.Add(assembly.Attribute("Source").Value);

МСУ,
Однако. Спасибо за информацию.
...
Рейтинг: 0 / 0
30.11.2010, 12:20
    #36985657
enigmatic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[SL] Проблема с загрузкой .xaml через XElement
Вобщем, а ларчик просто открывался.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Stream ManifestStream = Application.GetResourceStream(XapStreamResourceInfo,
    new Uri("AppManifest.xaml", UriKind.Relative)).Stream;

XElement root = XElement.Load(ManifestStream);
XNamespace ns = "http://schemas.microsoft.com/client/2007/deployment";
XNamespace x = "http://schemas.microsoft.com/winfx/2006/xaml";

var dllNames = root
    .Elements(ns + "Deployment.Parts")
    .Elements(ns + "AssemblyPart")
    .Select(part => part.Attribute("Source").Value);
Автор забыл про неймспейсы, за что и поплатился.
...
Рейтинг: 0 / 0
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / [SL] Проблема с загрузкой .xaml через XElement / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]