Текущий архив: 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.5 MB
Время: 0.047 c