XML в C # - чтение из ресурсов, манипулирование и отображение - PullRequest
5 голосов
/ 01 сентября 2008

Я хотел бы сделать следующее и не могу найти элегантный способ:

  1. Считайте шаблон XML в System.Xml.XmlDocument
  2. Заполните его данными из моего пользовательского интерфейса
  3. Преобразуйте его с помощью XSLT Я написал
  4. Применение CSS таблицы стилей
  5. Отдайте его на WebBrowser элемент управления

В настоящее время я читаю его из файла на диске, заполняю его, а затем сохраняю обратно на диск после заполнения. Я ссылаюсь на XSLT в шаблоне и CSS в XSLT, а затем использую метод WebBrowser.Navigate([filename]) для отображения файла XML.

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

Любая помощь высоко ценится

Ответы [ 4 ]

1 голос
/ 01 сентября 2008

Спасибо за ссылку, Кит, я посмотрю на это из интереса, так как LINQ находится в моем списке вещей для изучения. К сожалению, мне нужно настроить таргетинг на .Net 2.0 для этого приложения, поэтому я думаю (пожалуйста, поправьте меня, если я ошибаюсь!), Что о LINQ не может быть и речи.

Теперь я включил CSS в заголовок XSLT и нашел способ использовать объект System.Xml.Xsl.XslCompiledTransform для преобразования XML в памяти. В настоящее время я использую свойство WebBrowser.DocumentText для передачи отформатированного XML в компонент WebBrowser, и это, похоже, работает.

Я не могу не думать, что это не лучший способ сделать что-либо, поэтому любые комментарии о лучших способах будут оценены. В частности, если бы я использовал LINQ, нужна ли мне схема для привязки, а также должна ли я иметь схему с полной остановкой? Я не очень разбираюсь в XML, но мне нравится идея Вайбхава генерировать прямо из схемы, а не использовать шаблон. Я просто не уверен, с чего начать, поэтому любые указатели оценены!

1 голос
/ 01 сентября 2008

Быстрый вопрос. Зачем вам нужен шаблон XML? Если вы уже знаете схему заранее, просто сгенерируйте полный Xml в своем коде. Не должно быть необходимости загружать файл шаблона.

0 голосов
/ 03 октября 2008

Поскольку вы используете элемент управления WebBrowser и не WPF, вы должны зависеть от диска для загрузки файла CSS, который вы упомянули в шаге 4. Единственный способ обойти это инструмент, подобный Resource Hacker для загрузки «неуправляемых» ресурсов и использования протокола res: // (http://msdn.microsoft.com/en-us/library/aa767740(VS.85).aspx) для некоторых реальных ностальгий по Microsoft 1990-х.

Вам все равно нужно будет перенести ваши данные в элементы HTML. Пример кода, приведенный ниже, может помочь что-то ответить:

void WireUpBrowserEvents()
{

    HtmlElement table = this._browser.Document.GetElementById( "UnitFormsTable" );
    if ( table != null )
    {
        HtmlElementCollection thead = table.GetElementsByTagName( "thead" );
        if ( ( thead != null ) && ( thead.Count == 1 ) )
        {
            HtmlElementCollection links = thead[0].GetElementsByTagName( "a" );
            if ( ( links != null ) && ( links.Count > 0 ) )
            {
                foreach ( HtmlElement a in links )
                {
                    a.Click += new HtmlElementEventHandler( XslSort_Click );
                }
            }
        }
    }
}

void XslSort_Click( object sender, HtmlElementEventArgs e )
{
    e.ReturnValue = false;

    if ( this._xslSortWorker.IsBusy ) return;

    if ( sender is HtmlElement )
    {
        HtmlElement a = sender as HtmlElement;
        this._browser.Hide();
        this._browserMessage.Visible = true;
        this._browserMessage.Refresh();
        this._xslSortWorker.RunWorkerAsync( a.Id );
    }
}

Возможно, вы уже знаете, что HtmlElement и HtmlElementCollection находятся в пространстве имен System.Windows.Forms. Эти замечания могут быть бесполезны, но я пытался:)

0 голосов
/ 01 сентября 2008

Проверьте Linq to XML - это действительно хороший способ для записи и чтения данных на основе XML. Проще, чем механизмы System.Xml.XmlDocument.

Учитывая, что вы предоставляете XSLT и CSS, почему бы не создать страницу в XHTML и встроить CSS? В качестве альтернативы просто добавьте файлы XSLT и CSS в качестве содержимого в ваш установщик.

Скомпилированная справка на самом деле делает что-то похожее на то, что вы описываете - вы можете скопировать ссылку из файла CHM и открыть ее с помощью обычного браузера. Я полагаю, вы можете встроить свои ресурсы отображения в файл справки, в зависимости от того, как они используются.

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