Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.09.16;
Скачать: [xml.tar.bz2];

Вниз

Преобразование 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.045 c
9-1157787679
Viv
2006-09-09 11:41
2007.09.16
Ищу программку переводящую фонт в бмпшку...


6-1169573613
i-am-vladko
2007-01-23 20:33
2007.09.16
Indy


2-1188068008
Bad_B
2007-08-25 22:53
2007.09.16
Что я делаю не так?


15-1187351797
Вася Правильный
2007-08-17 15:56
2007.09.16
украинский подсказчик слов SMS в телефоне nokia


11-1169757682
Psychedelic
2007-01-25 23:41
2007.09.16
Опять проблема с именами :)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский