![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Преобразование XSD в XML [D7, WinXP]
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?