Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.09.16;
Скачать: CL | DM;

Вниз

Преобразование XSD в XML   Найти похожие ветки 

 
cantalia   (2007-08-24 10:28) [0]

Здравствуйте!

Моя программа вытаскивает данные из XML файла напрямую (ChildValues[]). С XML всё нормально, но появилась задача принимать данные из XSD. Как я могу внутренними средствами преобразовать XSD-файл в XML-данные?


 
Reindeer Moss Eater ©   (2007-08-24 10:39) [1]

А нафига? Что мешает читать все то же самое из XSD?


 
cantalia   (2007-08-24 10:47) [2]

Не подскажешь, как это реализовать? Я понять не могу, что надо использовать для чтения значений. В XML это ChildValues[], но при натраве её на XSD засыпает ошибками.

Если не сложно - простейший примерчик работы с XSD, плиз. Хотя бы как считать значения. Весь инет перерыл - ничё путного нет :(


 
Reindeer Moss Eater ©   (2007-08-24 10:49) [3]

XSD это тоже xml. Какие проблемы?


 
cantalia   (2007-08-24 11:12) [4]

Я с XSD столкнулся впервые...
Скажите, в нём не сохраняются данные? Экспортирую код
<?xml version="1.0" encoding="windows-1251" standalone="yes"?>
<label>
<caption>test_XSD</caption>
</label>

, получаю
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
 <xs:element name="label" type="labelType"/>
 <xs:complexType name="labelType">
   <xs:sequence>
     <xs:element name="caption" type="captionType"/>
   </xs:sequence>
 </xs:complexType>
 <xs:element name="caption" type="captionType"/>
 <xs:simpleType name="captionType">
   <xs:restriction base="xs:string"/>
 </xs:simpleType>
</xs:schema>


Нигде нет значения параметра caption :( Чтобы хранить значения, обязательно ещё и XML тащить? Тогда зачем вообще XSD нужен, если можно всю инфу брать из XML?


 
Reindeer Moss Eater ©   (2007-08-24 11:25) [5]

но появилась задача принимать данные из XSD.

Ты определись сначала, есть там данные, нужен ли тебе XSD и все остальное.
После чего парь людям мозг.


 
cantalia   (2007-08-24 11:33) [6]

Уточняю: в стороннем XSD-файле хранятся объекты и их свойства (к примеру, компонент TLabel и св-во Caption). Моя прога должна загружать этот файл и добавлять указанные объекты на форму.

То же самое с XML я сделал, всё оказалось просто, а ща грабли сплошные. Даже не пойму, как обратиться к конкретному элементу, структура файла навевает головную боль.

XSD мне нафик не нужен, но файлы заказчика, поделать ничего нельзя :(


 
clickmaker ©   (2007-08-24 11:36) [7]


> Тогда зачем вообще XSD нужен

http://searchwebservices.techtarget.com/sDefinition/0,,sid26_gci831325,00.html


 
cantalia   (2007-08-24 11:39) [8]


> clickmaker ©   (24.08.07 11:36) [7]

Читанул, спасибо.
Вроде даже лучше для моей задачи XSD использовать, но есть проблемы: как считать определённый параметр через TXMLDocument?


 
Reindeer Moss Eater ©   (2007-08-24 11:40) [9]

Даже не пойму, как обратиться к конкретному элементу

Да точно так же как и в простом XML.
Потому что xsd это тоже XML.


 
Slym ©   (2007-08-24 11:44) [10]

XSD - это схема описывающая XML документ
в XSD хранятся только поля, их типы данных, их последовательность и ничего кроме...
сами данные должны храниться в отдельном XML документе... Для проверки соответствия (валидации) загружаемого XML к парсеру подключают схему XSD
XMLValidate.js:
var sOutput = validateFile("100000.xml");
WScript.Echo(sOutput);

function validateFile(strFile)
{
   // Create a schema cache and add books.xsd to it.
   var xs = new ActiveXObject("MSXML2.XMLSchemaCache.4.0");
   xs.add("", "ICHB_EA.xsd");
   // Create an XML DOMDocument object.
   var xd = new ActiveXObject("MSXML2.DOMDocument.4.0");
   // Assign the schema cache to the DOMDocument"s
   // schemas collection.
   xd.schemas = xs;
   // Load books.xml as the DOM document.
   xd.async = false;
   xd.validateOnParse = true;
   xd.resolveExternals = true;
   xd.load(strFile);

   // Return validation results in message to the user.
   if (xd.parseError.errorCode != 0)
   {
        return("Validation failed on " + strFile +
               "\n=====================" +
               "\nReason: " + xd.parseError.reason +
               "\nSource: " + xd.parseError.srcText +
               "\nLine: " + xd.parseError.line + "\n");
   }
   else
        return("Validation succeeded for " + strFile +
               "\n======================\n" +
               xd.xml + "\n");
}


 
cantalia   (2007-08-24 11:48) [11]

ОК, для xml:
 result:=xml.ChildNodes["node"].ChildValues["element"]; *
уже для xsd, созданной на основе того же xml при помощи XML Mapper, не прокатывает. Куда рыть?

*xml:TXMLDocument


 
Reindeer Moss Eater ©   (2007-08-24 11:51) [12]

Куда рыть?

А где ты в своем XSD увидел узел с именем "node" ?


 
cantalia   (2007-08-24 11:57) [13]

Тогда каким образом мне можно обратиться к "element name" содержимого из >cantalia   (24.08.07 11:12) [4]
?


 
Reindeer Moss Eater ©   (2007-08-24 12:00) [14]

Не.
К терапевту.....


 
cantalia   (2007-08-24 12:02) [15]

>Reindeer Moss Eater ©   (24.08.07 12:00) [14]

Спасибо, и Вам того же :(


 
clickmaker ©   (2007-08-24 12:39) [16]


> [13] cantalia   (24.08.07 11:57)

xs: - это пространство имен
нужно указывать его при обращении к ноду.
Если хочешь его проигнорировать, можно так (пример для xpath)
rootNode.selectSingleNode("*[local-name()="element"]")


 
cantalia   (2007-08-24 13:06) [17]

> clickmaker ©   (24.08.07 12:39) [16]

Допустим, мне нужно вытащить из XSD (см. [4]) значение <xs:element name="caption" type="captionType"/>

Сл-но, нужно писать:
result:=xml.ChildNodes["xs:element"].ChildValues["name"];
?
Никак не разберусь :(


 
clickmaker ©   (2007-08-24 13:40) [18]

var
 Doc: TXMLDocument;
 Node: IXMLNode;
 V: OleVariant;

 Doc := TXmlDocument.Create(Self);
 Doc.LoadFromFile("c:\test.xsd");
 Doc.Active := true;
 Node := Doc.DocumentElement;
 V := Node.ChildNodes["xs:element"].Attributes["name"];


 
cantalia   (2007-08-24 13:56) [19]

>clickmaker ©   (24.08.07 13:40) [18]

Постоянно пишет "Only one top level element is allowed in an XML document"...
Пример Ваш, абсолютно идентичный моему. Ругается. Что не так?


 
cantalia   (2007-08-24 14:16) [20]

> cantalia   (24.08.07 13:56) [19]
Всё, разобрался, ошибка была в указании xml, а не node [см 11]:
Node := Doc.DocumentElement;
result:=xml.ChildNodes["node"].ChildValues["element"];  //ошибка!
result:=node.ChildNodes["node"].ChildValues["element"]; //OK

Всем спасибо большое, отдельный респект clickmaker :)


 
cantalia   (2007-08-24 15:15) [21]

Ещё вопрос: как переходить на сл. элемент в цикле?

<xs:element name="form" type="formType"/>
 <xs:complexType name="formType">
   <xs:sequence>
     <xs:element name="TImage" type="TImageType" minOccurs="0" maxOccurs="unbounded"/>
     <xs:element name="TLabel" type="TLabelType" minOccurs="0" maxOccurs="unbounded"/>
     <xs:element name="TBitBtn" type="TBitBtnType" minOccurs="0" maxOccurs="unbounded"/>
   </xs:sequence>
 </xs:complexType>
</xs:element>


В этом файле мне надо по очереди получить TImage,TLabel и TBitBtn.
Делаю так:
Node.ChildNodes.Nodes["complexType"].ChildNodes["sequence"].ChildNodes["element" ].Attributes["name"];

Выдаёт один и тот же атрибут TImage. Как получить список всех атрибутов?


 
iXT ©   (2007-08-24 15:18) [22]

for i:=0 to ChildNodes.Count-1


 
cantalia   (2007-08-24 15:22) [23]


> iXT ©   (24.08.07 15:18) [22]

ОК, дошло. Сенкс.

Node.ChildNodes.Nodes["complexType"].ChildNodes["sequence"].ChildNodes[i-1 ].Attributes["name"];



Страницы: 1 вся ветка

Текущий архив: 2007.09.16;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.027 c
2-1187717807
Alex.rus
2007-08-21 21:36
2007.09.16
CreateProcess


15-1187302091
Install
2007-08-17 02:08
2007.09.16
Что можно почитать о цветовой схеме YCbCr на русском?


2-1187631898
b86
2007-08-20 21:44
2007.09.16
научите меня как работает dragdrop


15-1187600182
@!!ex
2007-08-20 12:56
2007.09.16
ИНтересно, мне будет втык...


2-1187861485
TPel
2007-08-23 13:31
2007.09.16
снимок TPanel