Создание файла XML с использованием схемы - PullRequest
1 голос
/ 28 марта 2012

(относится к моему вопросу Синтаксический анализ XML с использованием схемы в C # )

Я работаю над кодом для приложения, которое будет использовать XML для хранения бизнес-объектов (они очень малы, поэтому я подумал, что XML проще анализировать, обрабатывать и проверять, чем использовать текст) файлы или некоторый пользовательский формат файла). Я уже написал схему, и мне было интересно, как мне добавить ссылку на эту схему в выводимые XML-файлы.

Как и в случае с вопросом, который я связал, я использую XmlDocument для записи файлов, потому что мне приходится работать в .net 3.5 - по тем же причинам, что и вопрос, с которым я связан. Я также использую XmlDeclaration, XmlNode и XmlElement для записи отдельных частей файла xml в объект XmlDocument.

Вот пример того, что я делаю:

if (!File.Exists(fileName))
{
    XmlDocument xmlDocumentWriter = new XmlDocument();
    XmlDeclaration xmlDec = xmlDocumentWriter.CreateXmlDeclaration("1.0", "utf-8", null);
    xmlDocumentWriter.AppendChild(xmlDec);

    XmlNode root = xmlDocumentWriter.CreateElement("root");
    XmlElement childNodeInfo = xmlDocumentWriter.CreateElement("parent-of-some-child");
    root.AppendChild(childNodeInfo);

    childNodeInfor.AppendChild(xmlDocumentWriter.CreateElement("SomeChild")).InnerText = _somevariable.ToString();
    /* continue in this way until they've all been added */

    xmlDocumentWriter.Appendchild(root);
    xmlDocumentWriter.Save(fileName);

    /* close all open streams and xml objects */
}

Который создаст XML-файл, подобный этому:

<?xml version="1.0" encoding="utf-8" ?>
    <root>
        <parent-of-some-child>
        <somechild>value</somechild>
        </parent-of-some-child>
    </root>

Но как мне добавить ссылку на схему в корневой узел?

Схема, которую я написал, выглядит примерно так:

<?xml version="1.0" encoding="utf-8" ?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
  xmlns="urn:schema-name"
  elementFormDefault="qualified">
    <xsd:element name="root">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element name="parent-of-some-child">
                    <xsd:complexType>
                        <xsd:sequence>
                            <xsd:element name="some-child" type="xsd:string"/>
                        </xsd:sequence>
                    </xsd:complexType>
                </xsd:element name="parent-of-some-child">
            </xsd:sequence>
        </xsd:complexType>
    </xsd:element name="root">

Я хочу создать что-то вроде этого:

<?xml version="1.0" encoding="utf-8" ?>
    <root xmlns="reference-to-schema">
        <parent-of-some-child>
        <somechild>value</somechild>
        </parent-of-some-child>
    </root>

Или мне даже нужна ссылка на схему в xml-файле? Будет ли достаточно использовать схему для проверки XML во время открытия и анализа?

1 Ответ

1 голос
/ 29 марта 2012

Вот пример:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;


namespace XmlNameSpace
{
    class Program
    {
        static void Main(string[] args)
        {
            XNamespace xmlns = XNamespace.Get("urn:schema-name");
            XNamespace xsi = XNamespace.Get("http://www.w3.org/2001/XMLSchema-instance");
            XNamespace schemaLocation = XNamespace.Get("urn:schema-name schema.xsd");

            XDocument p =  new XDocument(
                new XElement(xmlns + "root",
                    new XAttribute(XNamespace.Xmlns + "xsi", xsi),
                    new XAttribute(xsi + "schemaLocation", schemaLocation),
                    new XElement("parent-of-some-child",
                        new XElement("somechild","value"))
                )
            );


            p.Save("c:\\test.xml");


        }
    }
}
...