Добавление новых элементов в XmlDocument, которые соответствуют XSD - PullRequest
2 голосов
/ 10 февраля 2012

В настоящее время я добавляю элементы в свой XmlDocument, используя нотацию XPath, для которой я написал код, который помещает элемент в нужное место в файле. За одним исключением. Я не знаю, как заставить его обратить внимание на правила последовательности, определенные в моем файле XSD.

Есть ли способ добавить элемент в XmlDocument, чтобы он соответствовал последовательности, определенной в XSD, которая управляет моим XML-файлом?

Например, мой XML-документ должен выглядеть так:

<rootTag>
  <area name="I define an area">
    <description>some text here</description>
    <point x="1" y="1" />
    <point x="2" y="2" />
    <point x="3" y="3" />
  </area>
</rootTag>

Еще я получаю, в зависимости от порядка, в котором пользователь вводит значения для дочерних тегов выше:

<rootTag>
  <area name="I define an area">
    <point x="1" y="1" />
    <point x="2" y="2" />
    <point x="3" y="3" />
    <description>some text here</description>
  </area>
</rootTag>

Чтобы исправить вышесказанное, я создаю DataSet (с именем tempXmlDataset) из файла XSD. Я передаю содержимое XmlDocument в tempXmlDataset, и все соответствующим образом переупорядочивается.

Однако моя проблема вызвана опцией для первого дочернего элемента XML-документа. Эта опция определена в XSD, чтобы разрешить объекты "площадь", "линия" или "точка". «area» и «line» оба имеют «точечные» элементы как дочерние. Но дочерняя «точка» - это не то же самое, что «точечный» объект. Итак, как вы, возможно, уже поняли, tempXmlDataset.ReadXmlSchema (...) создает «точечную» таблицу, в которой есть только x и y. Это по определению детей для "области" и "линии".

Поэтому, когда мой код запускает tempXmlDataset.ReadXml (...), атрибуты для объекта «точка» не считываются, потому что он видит объект «точка» как дочернюю «точку». Вот пример «точечного» объекта:

<rootTag>
  <point name="I define a point" x="3" y="3" otherAttributes="">
    <description>some text here</description>
  </point>
</rootTag>

Ответы [ 2 ]

1 голос
/ 10 февраля 2012

Поскольку вы пометили этот C #, я предполагаю, что вы находитесь на платформе .NET. System.Xml.Schema будет вашим лучшим другом.Для программы, использующей вышеуказанный API для генерации XML, которая также поставляется с исходным кодом, который вы можете использовать, чтобы понять, как решить вашу проблему, я бы использовал XmlSampleGenerator .

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

Если вы не ограничиваетес самого начала может быть невозможно попытаться изменить порядок на основе XSD (см. this также в SO) ...

0 голосов
/ 11 февраля 2012

используйте xsd.exe для генерации необходимого кода на основе xsd для классов. Не пытайтесь создать набор данных для этого случая. Затем вы можете использовать сгенерированный код вместе с XmlSerializer для создания необходимых XML-файлов.

http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlserializer.aspx

Также см .: http://msdn.microsoft.com/en-us/library/ms950721.aspx

...