powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / проверка XML
11 сообщений из 11, страница 1 из 1
проверка XML
    #33439747
efiml
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пытаюсь проверить XML с помощью XSD схемы
Нашел пример на MSXML 4.0 SDK
При выполнении выходит, что оба XML правильные.
В чем может быть дело?

программа
priv sOutput As String
sOutput = ValidateFile("validXML.xml")
sOutput = sOutput + ValidateFile("notvalidxml.xml")
MESSAGEBOX(sOutput)
Function ValidateFile(strFile As String)
*Create an XML DOMDocument object.
local x As msxml.DOMDocument,cRet AS String
x=CREATEOBJECT('msxml.DOMDocument')


*Load and validate the specified file into the DOM.
x.async = .F.
x.validateOnParse = .T.
x.resolveExternals = .T.
x.Load(strFile)
*Return validation results in message to the user.
If x.parseError.errorCode <> 0
cRet = "Validation failed on " +;
strFile +CHR(13)+;
"=====================" +CHR(13)+;
"Reason: " + x.parseError.reason +;
+CHR(13) + "Source: "+;
x.parseError.srcText +;
+CHR(13)+ "Line: " +;
x.parseError.Line
Else
cRet = "Validation succeeded for " +;
strFile +CHR(13)+;
"======================"+;
CHR(13) + x.xml +CHR(13)
EndIf
RETURN cRet

notvalidxml.xml
<?xml version="1.0"?>
<catalog>
<book xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="nn.xsd"
id="bk101">
<author>Gambardella, Matthew</author>
<title>XML Developer's Guide</title>
<genre>Computer</genre>
<cost>44.95</cost>
<publish_date>2000-10-01</publish_date>
<description>An in-depth look at creating applications with
XML.</description>
</book>
</catalog>

validxml.xml
<?xml version="1.0"?>
<catalog>
<book xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="nn.xsd"
id="bk101">
<author>Gambardella, Matthew</author>
<title>XML Developer's Guide</title>
<genre>Computer</genre>
<price>44.95</price>
<publish_date>2000-10-01</publish_date>
<description>An in-depth look at creating applications with
XML.</description>
</book>
</catalog>

nn.xsd<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="book" type="bookdata"/>
<xsd:complexType name="bookdata">
<xsd:sequence>
<xsd:element name="author" type="xsd:string"/>
<xsd:element name="title" type="xsd:string"/>
<xsd:element name="genre" type="xsd:string"/>
<xsd:element name="price" type="xsd:float"/>
<xsd:element name="publish_date" type="xsd:date"/>
<xsd:element name="description" type="xsd:string"/>
</xsd:sequence>
<xsd:attribute name="id" type="xsd:string"/>
</xsd:complexType>
</xsd:schema>
...
Рейтинг: 0 / 0
проверка XML
    #33439961
qu-qu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
efiml...При выполнении выходит, что оба XML правильные.
В чем может быть дело?
...

На мой взгляд в том, что в функции ValidateFile нет никакого упоминания по схему nn.xsd , поэтому парсер проверяет входящие документы только на well-formed .
Если пример кода взят из MSXML 4.0 SDK, то, по-моему, надо создавать XML-DOM объекты по PRGID = "MSXML2.DOMDocument.5.0" (что соответствует версии парсера msxml.dll 4.0), а не "msxml.DOMDocument" (что соответствует версии парсера msxml.dll 3.0 и ниже, но включено для "обратной совместимости" в MSXML 4.0 SDK).
...
Рейтинг: 0 / 0
проверка XML
    #33439993
qu-qu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qu-qu... по-моему, надо создавать XML-DOM объекты по PRGID = "MSXML2.DOMDocument.5.0" ...

Эксперимент - подтвердил догадки...
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
x=CREATEOBJECT('msxml.DOMDocument')
x.async = .F.
x.validateOnParse = .T.
x.resolveExternals = .T.
x.Load("nonvalid.xml")
?x.parseError.Reason && <- тут пусто как в степи зимой...
x=CREATEOBJECT('msxml2.DOMDocument.5.0')
x.async = .F.
x.validateOnParse = .T.
x.resolveExternals = .T.
x.Load("nonvalid.xml")
?x.parseError.Reason && <- тут все "как доктор прописал": "Element 'cost' is unexpected according to content model of parent element 'book'. Expecting: price."
...
Рейтинг: 0 / 0
проверка XML
    #33443237
efiml
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Все получилось! Большое спасибо! Попутно не подскажите как в msxml2.DOMDocument.5.0 указать xsd схему для xml документа, если в xml нет параметра noNamespaceSchemaLocation ?
...
Рейтинг: 0 / 0
проверка XML
    #33443543
qu-qu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
efiml... как в msxml2.DOMDocument.5.0 указать xsd схему для xml документа, если в xml нет параметра noNamespaceSchemaLocation ?

Что-то типа так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
x=CREATEOBJECT('msxml2.DOMDocument.5.0')
x.async = .F.
x.validateOnParse = .T.
?x.Load("nn.xsd")
?x.parseError.reason
s=CREATEOBJECT('msxml2.XMLSchemaCache.5.0')
s.addCollection(x.namespaces)
?x.Load("nonvalid.xml")
?x.parseError.reason
?x.Load("valid.xml")
?x.parseError.reason
...
Рейтинг: 0 / 0
проверка XML
    #33443783
M0us
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
пример из MSDN (JScript)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
var sOutput = validateFile("test.xml");
WScript.Echo(sOutput);

function validateFile(strFile)
{
    var xs = new ActiveXObject("MSXML2.XMLSchemaCache.4.0");
    xs.add("test", "test.xsd");

    var xd = new ActiveXObject("MSXML2.DOMDocument.4.0");
    xd.schemas = xs;
    xd.async = false;
    xd.validateOnParse = true;
    xd.resolveExternals = true;
    xd.load(strFile);

    if (xd.parseError.errorCode !=  0 ){
			return("выявлены ошибки при проверке файла " + strFile + 
                "\n================================================" +
                "\nReason: " + xd.parseError.reason + 
                "\nSource: " + xd.parseError.srcText + 
                "\nLine: " + xd.parseError.line + "\n");
      }
		else{
			return("ошибки при проверке не выявлены " + strFile + 
                "\n==============================================\n" +
                xd.xml + "\n");
			}
}

ЗЫ Уважаемый efiml, оформляйте плиз исходники на форуме тегами SRC как это делает qu-qu
...
Рейтинг: 0 / 0
проверка XML
    #33444722
qu-qu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
M0usпример из MSDN (JScript)

Код: plaintext
1.
2.
3.
4.
5.
....
    xs.add("test", "test.xsd");
....
    xd.schemas = xs;
....

М-дя... напутал я сгоряча с методами XMLSchemaCache ( addCollection - это для добавления уже "готовой" существующей XMLSchemaCache), вот так - получше будет:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
x=CREATEOBJECT('msxml2.DOMDocument.5.0')
x.async = .F.
x.validateOnParse = .T.
?x.Load("nn.xsd")
?x.parseError.reason
s=CREATEOBJECT('msxml2.XMLSchemaCache.5.0')
s.add(x.namespaceURI ,x)
x.schemas = s
?x.Load("nonvalid.xml")
?x.parseError.reason
?x.Load("valid.xml")
?x.parseError.reason

З.Ы. только схему изначальную придется немного переделать:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
<?xml version="1.0"?>
<!-- nn.xsd -->
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="catalog" type="catalogdata"/>
<xsd:complexType name="catalogdata">
<xsd:sequence>
<xsd:element name="book" type="bookdata"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="bookdata">
<xsd:sequence>
<xsd:element name="author" type="xsd:string"/>
<xsd:element name="title" type="xsd:string"/>
<xsd:element name="genre" type="xsd:string"/>
<xsd:element name="price" type="xsd:float"/>
<xsd:element name="publish_date" type="xsd:date"/>
<xsd:element name="description" type="xsd:string"/>
</xsd:sequence>
<xsd:attribute name="id" type="xsd:string"/>
</xsd:complexType>
</xsd:schema>
...
Рейтинг: 0 / 0
проверка XML
    #33445437
efiml
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У меня не получилось
[CSV]x=CREATEOBJECT('msxml2.DOMDocument.5.0')
x.async = .F.
x.validateOnParse = .T.
?x.Load("nn.xsd")
?x.parseError.reason
s=CREATEOBJECT('msxml2.XMLSchemaCache.5.0')
s.add(x.namespaceURI ,x)
x.schemas = s
?x.Load("nonvalid.xml") && Документ не загружается
?x.parseError.reason && The system cannot locate the object specified.

У меня еще вопрос. Вы извините за назойливость, но сроки поджимают...
Я проверяю документ по xsd и получаю ошибку, а причину понять не могу.
Программа проверки

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
priv sOutput As String
 local x As Msxml2.DOMDocument. 4 . 0 ,cRet AS String 
 *Load and validate the specified file into the DOM.
 x=CREATEOBJECT('Msxml2.DOMDocument.4.0')
 x.async = .F.
 x.validateOnParse = .T.
 x.resolveExternals = .T.
 x.Load('test.xml')
 If x.parseError.errorCode <>  0  
   cRet = "Ошибка. Причина " + x.parseError.reason +;
                        +CHR( 13 ) + "Текст: "+;
                        x.parseError.srcText +;
                        +CHR( 13 )+ "Строка: " +;
                        STR(x.parseError.Line, 5 ) 
     Else
         cRet = "Проверка прошла успешно"
     EndIf
 MESSAGEBOX(cRet, 16 ,'Проверка XML')
Сообщение об ошибке
Код: plaintext
1.
2.
3.
4.
Ошибка. Причина Element content is invalid according to the DTD/Schema.
Expecting: СвПравЮл, СвПравФл.

 Текст: <СвПравФл>
Сторка:     83 "
Судя по схеме не должно быть ошибки.
XSD и XML прилагаю
...
Рейтинг: 0 / 0
проверка XML
    #33445810
M0us
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
особенно не вникая в исходники (пока нет времени) могу сказать, что последовательность элементов в схеме тоже играют роль.
т.е. например
Код: plaintext
1.
2.
3.
4.
<первый>
<третий/>
<второй/>
</первый>
валидироваться не будет, а

Код: plaintext
1.
2.
3.
4.
<первый>
<второй/>
<третий/>
</первый>
будет валидным.

про ошибку:
Ошибка. Причина Element content is invalid according to the DTD/Schema.
Expecting: СвПравЮл, СвПравФл.
- отсутствуют элементы СвПравЮл и СвПравФл.
...
Рейтинг: 0 / 0
проверка XML
    #33446190
qu-qu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
efimlУ меня не получилось
....
?x.Load("nonvalid.xml") && Документ не загружается
?x.parseError.reason && The system cannot locate the object specified.
...

Это я виноват, каюсь, я в своем примере переименовал ваш исходный файл с no t valid.xml в no n valid.xml (типа решил быть - "самым грамотным" и не предупредил).

По поводу "сроки поджимают..." и вот этого:
efiml
Код: plaintext
1.
Текст: <СвПравФл>
Сторка:     83 "


Когда-то давно, читал я книжку про XML на аглицком языке, так там был 1 раздельчик, специально посвященный программистам на VB (VFP тоже подойдет): начинался он фразой типа:
"Remember the three most valued things - XML IS CASE-SENSITIVE! XML IS CASE-SENSITIVE!!! XML IS CASE-SENSITIVE!!!!!"
(вы определяете в схеме элемент СвПравФ Л , а пишете в документе СвПравФ л ).

"ТщательнЕе надо, ребята..." © М.М. Жванецкий
...
Рейтинг: 0 / 0
проверка XML
    #33448058
efiml
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
БОЛЬШОЕ СПАСИБО!
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / проверка XML
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]