Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> XmlWriter префиксы и нэймспейсы 
:(
    Опции темы
Compositum
  Дата 24.4.2012, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Senior developer
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 430
Регистрация: 6.1.2008
Где: Санкт-Петербург

Репутация: нет
Всего: 1



Доброго времени суток. Как с помощью объекта System.Xml.XmlWriter создать такой документ(?):
Код

<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="../../support/localization.xslt"?>
<doc:resources
  xmlns:doc="http://mea-orbis.com/2012/XMLSchema/localization"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://mea-orbis.com/2012/XMLSchema/localization 
  ../../support/localization.xsd">
  <doc:record id="k1"><![CDATA[Вася]]></doc:record>
  <doc:record id="k2"><![CDATA[Петя]]></doc:record>
  <doc:record id="k3"><![CDATA[Коля]]></doc:record>
  <doc:record id="k4"><![CDATA[Дима]]></doc:record>
  <doc:record id="k5"><![CDATA[Иван]]></doc:record>
  <doc:record id="k6"><![CDATA[Люба]]></doc:record>
  <doc:record id="k7"><![CDATA[Вера]]></doc:record>
  <doc:record id="k8"><![CDATA[Ира]]></doc:record>
</doc:resources>

На данный момент написал такой код:
Код

public void WriteXml(System.Xml.XmlWriter writer)
{
    writer.WriteProcessingInstruction("xml", "version=\"1.0\" encoding=\"utf-8\"");
    writer.WriteProcessingInstruction("xml-stylesheet", 
        "type=\"text/xsl\" href=\"../../support/localization.xslt\"");            
    writer.WriteStartElement("resources");            
    foreach (KeyValuePair<string,string> item in dict)
    {
        writer.WriteStartElement("record");
        writer.WriteAttributeString("id", item.Key);
        writer.WriteCData(item.Value);
        writer.WriteEndElement();
    }
    writer.WriteEndElement();            
}

Результат работы кода выглядит так:
Код

<?xml version="1.0" encoding="utf-8"?>
<resources>
  <record id="k1"><![CDATA[Вася]]></record>
  <record id="k2"><![CDATA[Петя]]></record>
  <record id="k3"><![CDATA[Коля]]></record>
  <record id="k4"><![CDATA[Дима]]></record>
  <record id="k5"><![CDATA[Иван]]></record>
  <record id="k6"><![CDATA[Люба]]></record>
  <record id="k7"><![CDATA[Вера]]></record>
  <record id="k8"><![CDATA[Ира]]></record>
</resources>

Как видим, вторая инструкция (xml-stylesheet) отсутствует. Как правильно её записать программно с помощью System.Xml.XmlWriter? Как правильно программно записать все необходимые пространства имён и их префиксы? Причём префиксы должны присутствовать перед всеми элементами.

Спасибо
PM   Вверх
diadiavova
Дата 24.4.2012, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 31
Всего: 142



Хмл-декларацию не надо записывать как инструкцию приложения. Она и сама появиться должна, если ее надо пропустить, то это достигается с помощью свойства Settings, там у объекта настроек есть свойство OmitXmlDeclaration. Что касается инструкции стайлшит, то тут не знаю, по идее должна записаться, возможно сбой из-за попытки записать хмл-декларацию как инструкцию, попробуй убрать и посмотри, что будет.
Для элементов префиксы записываются с помощью перегрузки использованного тобой метода.
http://msdn.microsoft.com/ru-ru/library/7cdfkth5.aspx


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
Compositum
Дата 24.4.2012, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Senior developer
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 430
Регистрация: 6.1.2008
Где: Санкт-Петербург

Репутация: нет
Всего: 1



Цитата

Хмл-декларацию не надо записывать как инструкцию приложения. Она и сама появиться должна, если ее надо пропустить, то это достигается с помощью свойства Settings, там у объекта настроек есть свойство OmitXmlDeclaration. 

это я уже понял.
Цитата

Что касается инструкции стайлшит, то тут не знаю, по идее должна записаться, возможно сбой из-за попытки записать хмл-декларацию как инструкцию, попробуй убрать и посмотри, что будет.
Для элементов префиксы записываются с помощью перегрузки использованного тобой метода.
http://msdn.microsoft.com/ru-ru/library/7cdfkth5.aspx 

эти разделы я уже не раз перелопатил, но не нашел хороших примеров. Выбросил в ведро XmlWriter и переписал всё на LINQ to XML. Работает как часы. Код такой:
Код

        public XDocument GetXml()
        {
            XNamespace doc = "http://mea-orbis.com/2012/XMLSchema/localization";
            XNamespace xsi = "http://www.w3.org/2001/XMLSchema-instance";

            //Инструкция привязки
            XProcessingInstruction styleInstr = new XProcessingInstruction("xml-stylesheet",
                "type=\"text/xsl\" href=\"../../support/localization.xslt\"");

            XDocument xd = new XDocument();//создаём объект документа
            xd.Add(styleInstr);

            XAttribute ns1 = new XAttribute(XNamespace.Xmlns + "doc", doc);
            XAttribute ns2 = new XAttribute(XNamespace.Xmlns + "xsi", xsi);
            XElement root = new XElement(doc + "resources");

            xd.Add(root);
            root.Add(ns1);
            root.Add(ns2);

            root.Add(new XAttribute(xsi + "schemaLocation",
                "http://mea-orbis.com/2012/XMLSchema/localization" +
                " ../../support/localization.xsd"));

            foreach (KeyValuePair<string, string> item in dict)
            {
                XElement xitem = new XElement(doc + "record");
                xitem.Add(new XAttribute("id", item.Key));
                xitem.Add(new XCData(item.Value));
                root.Add(xitem);
            }
            return xd;
        }

результат работы кода такой:
Код

<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="../../support/localization.xslt"?>
<doc:resources xmlns:doc="http://mea-orbis.com/2012/XMLSchema/localization" 
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
               xsi:schemaLocation="http://mea-orbis.com/2012/XMLSchema/localization ../../support/localization.xsd">
  <doc:record id="k1"><![CDATA[Вася]]></doc:record>
  <doc:record id="k2"><![CDATA[Петя]]></doc:record>
  <doc:record id="k3"><![CDATA[Коля]]></doc:record>
  <doc:record id="k4"><![CDATA[Дима]]></doc:record>
  <doc:record id="k5"><![CDATA[Иван]]></doc:record>
  <doc:record id="k6"><![CDATA[Люба]]></doc:record>
  <doc:record id="k7"><![CDATA[Вера]]></doc:record>
  <doc:record id="k8"><![CDATA[Ира]]></doc:record>
</doc:resources>


Это сообщение отредактировал(а) Compositum - 24.4.2012, 15:21
PM   Вверх
diadiavova
Дата 24.4.2012, 15:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 31
Всего: 142



Цитата(Compositum @  24.4.2012,  16:18 Найти цитируемый пост)
Выбросил в ведро XmlWriter и переписал всё на LINQ to XML.

А если в его использовании не было необходимости, то к чему вообще весь сыр-бор разводить было? smile 


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
Compositum
Дата 24.4.2012, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Senior developer
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 430
Регистрация: 6.1.2008
Где: Санкт-Петербург

Репутация: нет
Всего: 1



Цитата(diadiavova @ 24.4.2012,  15:20)
Цитата(Compositum @  24.4.2012,  16:18 Найти цитируемый пост)
Выбросил в ведро XmlWriter и переписал всё на LINQ to XML.

А если в его использовании не было необходимости, то к чему вообще весь сыр-бор разводить было? smile

Я хотел разобраться как это сделать с помощью XmlWriter. Не получилось, поэтому отказался от этой идеи.
PM   Вверх
diadiavova
Дата 24.4.2012, 17:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 31
Всего: 142



Цитата(Compositum @  24.4.2012,  16:24 Найти цитируемый пост)
Я хотел разобраться как это сделать с помощью XmlWriter.  

Да собственно вот так как-то. 
Код

public void WriteXml(System.Xml.XmlWriter writer)
        {
            var dict = new Dictionary<string, string>() { { "k1", "Петя" }, { "k2", "Вася" }, { "k3", "Коля" }, { "k4", "Дима" } };
            writer.WriteStartDocument();
            writer.WriteProcessingInstruction("xml-stylesheet",
                "type=\"text/xsl\" href=\"../../support/localization.xslt\"");
            writer.WriteStartElement("resources");
            writer.WriteAttributeString("xsi",  "schemaLocation","http://www.w3.org/2001/XMLSchema-instance", 
"http://mea-orbis.com/2012/XMLSchema/localization ../../support/localization.xsd");
            writer.WriteAttributeString("xmlns:doc", "http://mea-orbis.com/2012/XMLSchema/localization");
            foreach (KeyValuePair<string, string> item in dict)
            {
                writer.WriteStartElement("doc","record","http://mea-orbis.com/2012/XMLSchema/localization");
                writer.WriteAttributeString("id", item.Key);
                writer.WriteCData(item.Value);
                writer.WriteEndElement();
            }
            writer.WriteEndElement();
        }



Это сообщение отредактировал(а) diadiavova - 24.4.2012, 23:15


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0449 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.