Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > XmlWriter префиксы и нэймспейсы


Автор: Compositum 24.4.2012, 14:04
Доброго времени суток. Как с помощью объекта 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? Как правильно программно записать все необходимые пространства имён и их префиксы? Причём префиксы должны присутствовать перед всеми элементами.

Спасибо

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

Автор: Compositum 24.4.2012, 15:18
Цитата

Хмл-декларацию не надо записывать как инструкцию приложения. Она и сама появиться должна, если ее надо пропустить, то это достигается с помощью свойства 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>

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

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

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

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

Я хотел разобраться как это сделать с помощью XmlWriter. Не получилось, поэтому отказался от этой идеи.

Автор: diadiavova 24.4.2012, 17:20
Цитата(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();
        }


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)