Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Преобразование XSD в XML [D7, WinXP]


Страницы:   1 2

cantalia ©   (2007-08-24 10:28:00) 

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

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


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


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

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

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


iXT   (2007-08-24 15:18:00) [2]

for i:=0 to ChildNodes.Count-1


cantalia   (2007-08-24 15:15:00) [3]

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

<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. Как получить список всех атрибутов?


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

> 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 13:56:00) [5]

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

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


clickmaker   (2007-08-24 13:40:00) [6]

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:06:00) [7]

> 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 12:39:00) [8]


> [13] cantalia   (24.08.07 11:57)

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


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

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

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


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

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


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

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


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

Куда рыть?

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


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

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

*xml:TXMLDocument


Slym   (2007-08-24 11:44:00) [14]

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");
}


Reindeer Moss Eater   (2007-08-24 11:40:00) [15]

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

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


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


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

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


clickmaker   (2007-08-24 11:36:00) [17]


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

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


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

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

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

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


Reindeer Moss Eater   (2007-08-24 11:25:00) [19]

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

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


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

Я с 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?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо