XMLSpy使用说明及技巧
- 格式:doc
- 大小:605.50 KB
- 文档页数:10
XML Spy实例教程/school · 2004-12-23 12:13:16 · 来源: 天极网在读这篇教程之前,你至少应当确认自己对XML相当熟知,使用记事本或其他工具编辑过XML、DTD以及XSLT文档,并且熟悉它们的语法及用途,否则请先补过课之后再来阅读本教程。
XML Spy是Icon Information System开发的支持XML,XSL,XSLT,DTD,Schema等等多种文件格式的编辑器。
它可以将XML展示为完美的树型结构,可以方便的使用各种HTML/XML/XSLT标记,使用它可以大大节约我们的开发时间,不必把大量的时间浪费在代码的输入上。
下面我们通过一个存储电影信息的实例来学习一下XML Spy的使用方法。
第一步:我们要设计三个文件:saveit.xml,saveit.dtd和saveit.xslt;saveit.xml 负责存储具体电影内容数据,saveit.dtd负责对saveit.xml的验证,而saveit.xslt则负责对saveit.xml进行样式变换,确定它在浏览器里的最终显示效果。
先来看看我们需要建立的三个文件的代码:----------saveit.xml------------------<?xml version="1.0" encoding="GB2312"?><!DOCTYPE movies SYSTEM "G:\\\\xmlspy\\\\saveit.dtd"><?xml-stylesheet type="text/xsl" href="G:\\\\xmlspy\\\\saveit.xslt"?><movies type="动作片"><id>1</id><name>致命摇篮</name><brief>李连杰最新力作!</brief><time>2003</time></movies>----------saveit.dtd------------------<?xml version="1.0" encoding="GB2312"?><!ELEMENT movies (id, name, brief, time)><!ATTLIST movies type CDATA #REQUIRED><!ELEMENT id (#PCDATA)><!ELEMENT name (#PCDATA)><!ELEMENT brief (#PCDATA)><!ELEMENT time (#PCDATA)>----------saveit.xslt------------------<?xml version="1.0" encoding="UTF-8"?><xsl:stylesheet version="1.0" xmlns:xsl="/1999/XSL/Transform"><xsl:output method="xml" version="1.0" encoding="GB2312" indent="yes"/><xsl:template match="/"><html><head><title>:::凌云的XML Spy教程:::</title></head><body><xsl:apply-templates></xsl:apply-templates></body></html></xsl:template><xsl:template match="movies">第<xsl:value-of select="id"></xsl:value-of>部电影<table><tbody><tr><td>名称</td><td>简介</td><td>时间</td><td>类型</td></tr><tr><td><xsl:value-of select="name"></xsl:value-of></td><td><xsl:value-of select="brief"></xsl:value-of></td><td><xsl:value-of select="time"></xsl:value-of></td><td><xsl:value-of select="@type"></xsl:value-of></td></tr></tbody></table></xsl:template></xsl:stylesheet>第二步:使用XML Spy建立saveit.dtd文档。
14创建一个XML文档本节,您将学会如何在XMLSpy 2005中创建并使用XML文档,以及如何使用XMLSpy 2005中的各种智能编辑功能。
您在本节将完成以下任务:∙根据AddressLast.xsd schema新建一个XML文档。
∙为元素指定类型,以扩展其内容模型。
(如果在XML文档中使用了扩展的内容模型,而没有在相应的XML Schema中对内容模型作扩展,将会导致验证错误。
)∙在Grid视图和Text视图中利用智能输入助手插入元素及属性。
∙从XMLSpy 2005中复制XML数据到Microsoft Excel中;在MS Excel中添加新数据;然后把在MS Excel中修改过的数据复制回XML Spy2005。
该功能可以在Grid视图的数据库/表格视图中使用。
∙用数据库/表格视图的排序功能对XML元素进行排序。
∙验证XML文档。
∙修改schema,以允许三位数的分机号码。
本节将用到的命令本节,您将主要使用Grid视图和Text视图,其中有一个小节您会用到Schema/WSDL视图。
下面介绍您将会用到的命令:File | New。
新建一个XML文件。
View | Text View.切换到Text视图。
View | 增强型Grid视图.切换到增强型Grid视图。
XML | Table | Display as Table.将某一层次上的多个同类型元素显示为表格形式。
这种显示元素的视图叫做数据库/表格视图(Database/Table View)(或简称表格视图)。
该图标用于在表格视图和普通的Grid视图间进行切换。
F7.检查文档的良构型(well-formedness)。
F8.根据关联的DTD或Schema验证(validate)XML文档。
打开相关联的DTD或XML Schema文件。
附:XMLSpy环境和使用:1、创建最简单的XML文档(即不使用XML模式验证有效性的文档):(1)选择菜单“File-New”,在打开的对话框这个选择文件类型为“Extensible Mark Language”,如下图:点击OK,在以下弹出的对话框中不选择任何XML模式,直接点击cancel,则可以进入XML文档的编辑界面。
图1(2)完成XML文档编辑并保存以后,需要检查XML文档是否是良好格式的,选择菜单“XML-Checked Well-Formedness”或工具栏上的相应按钮:或工具栏:2. 创建用DTD或XML Schema验证的XML文档(1)创建DTD或XML Schema:创建DTD文档:选择菜单“File-New”,在打开的对话框中选择文档类型为“dtd Document Type Definition”,并点击OK,即可进入DTD文档编辑界面;创建XML Schema:选择菜单“File-New”,在打开的对话框中选择文档类型为“xsd W3C XML Schema”, 并点击OK,即可进入XML Schema文档编辑界面;注意:普通XML文档和DTD文档编辑界面默认的选项卡均为Text,而XML Schema文档编辑界面默认的选项卡为,需要切换到Text。
(2)创建引用DTD或XML Schema文档的XML文档步骤和创建普通文档类似,只不过在图1的对话框中选择DTD或XML Schema,点击OK后在打开的对话框中指定DTD或XML Schema文档即可,如下注意:复选框“Make path relative to …”用于选择是否在引用DTD或XML Schema 时使用相对路径。
(3)如果要检查XML文档是否是有效的,则选择菜单“XML-Validate XML”或工具栏上的相应按钮,工具栏如下:。
4以鼠标拖放的方式添加元素
前面,您是通过在一个元素或容器上右击、然后使用上下文菜单来添加元素的。
其实,您也可以通过鼠标拖放的方式来添加元素,这种方式比使用菜单命名更为快捷。
本节,您要通过鼠标拖放的方式来完成Address等元素的创建。
具体步骤如下:
1.鼠标单击Name元素不放,同时按住Ctrl键不放[译注//也可以先按住Ctrl键不放,再
单击Name元素不放],然后用鼠标拖动该元素框。
此时鼠标光标处将出现一个“+”图标,表明您将要复制元素。
同时也会出现一个元素框的副本以及连接线(表明该元素副本将
被插入的位置)。
2.如果所选插入位置合法的话,松开鼠标键,即可创建新元素。
如果不小心把新元素放在
了错误的位置上,那么用鼠标将其拖至Name元素的下方。
这样,一个Name元素的副
本便创建好了。
3.双击新创建元素的方框,然后输入Street作为其元素名称。
4.我们可以用同样的方法再创建一个City元素。
现在的内容模型将如下所示:
Address元素有以下元素序列:一个Name元素、一个Street元素和一个City元素。
XMLSpy 使用说明1:XMLSpy图标:
2:双击XMLSpy图标进入:
3:选择SOAP>Create new SOAP request
4:弹出界面
5:在Choose a file:栏输入要测试的接口的所属wsdl地址,点击ok
6:选择具体测试的接口名称,点击ok
7:在<reqHead>…</reqHead>之间的<txnTime>String</txnTime>中填写正确的日期格式<txnTime>2011-01-01 01:01:01</txnTime>,在<reqHead>…</reqHead>之后的接口入参中输
入查询条件,如果某个参数不需要输入,则将该参数标签之间的默认内容清空。
8:选择SOAP>Send request to server
9:XMLSpy展示根据输入条件查询的结果
10:如果有必要保留结果,请另存为*.xml文件。
11:性能三etl服务器(197.3.176.11)上可以查询性能三环境的回单系统和客户服务总揽系统:前台应用对应的IP:端口号为:197.3.176.32:50200;准生产etl服务器(197.3.6.126)上可以查询准生产环境的回单系统和客户服务总揽系统:前台应用对应的IP:端口号为:197.0.94.13:50000;回单系统的接口文件在VSS目录的1824下《ECIF_客户对账单服务接口文件说明_VXXX.xls》,客户服务总揽系统接口文件在VSS目录的1821下《ECIF_客服总览
服务接口文件说明_vXXX.xls》。
20在Grid视图中添加元素和属性
目前,文档中仅有一个Person元素。
要新添一个Person元素,请按下列步骤执行:
1.点击Address元素左侧的边条(sidebar),将其折起。
这样Grid视图会显得更加简
洁。
2.在Grid视图中,点击Person元素的标题(即“Person”文字)以选中整个Person元素。
可以看到,现在Person元素在Elements窗口的Append选项卡中是可用的。
3.在Elements窗口的Append选项卡中双击Person元素,这将在已有的Person元素
后新添(append)一个Person元素,而Person应包含的子元素也将自动生成(见
下图)。
(注意:由于Title元素是可选的,因此它没有被自动插入。
)
4.点击新添Person元素的Manager属性。
看一下Attributes窗口。
由于Manager属性
已经出现过一次了,因此现在它在列表中呈灰色。
再看一下Info窗口(缺省在主窗口左侧),可以看到其中列出了Manager属性的有关信息。
5.在Attributes窗口的Append选项卡中,双击Programmer,Manager属性后将插入一
个空的Programmer属性。
现在,Attributes窗口中的Programmer也变为灰色的了。
虽然现在您也可以在当前普通Grid视图中为新添的Person元素输入内容,但我们希望切换到Grid视图的数据库/表格视图,因为那里更适于编辑多条结构相同的数据(比如这里的Person 元素)。
XMLSPY 用户手册6.9.1 创建一个基本的XML Schema(1)在新建一个Schema文档在新建一个Schema文档时,窗口中将出现一个以Schema/WSDL设计视图打开的空schema文件。
注:Schema/WSDL设计视图本身有两种显示方式:Schema概要视图(Schema Overview)——为整个schema提供一个关于所有全局成分的概要;以及内容模型视图(Content Model View)——为各个全局成分提供内容模型视图。
在新建XML Schema文件时,Schema/WSDL视图将以Schema概要视图打开。
您会被提示输入根元素(root element)的名称。
(2)点击加亮的字段,并输入根元素Company。
然后以回车键确认。
您在主窗口中所看到的视图称为Schema概要视图(Schema Overview)。
它为该schema提供了一个概要:上方窗格(pane)中列出了所有的全局成分;下方窗格中显示所选全局成分的属性(attribute)及唯一性约束(identity constraint)。
(只需点击全局成分左侧的图标即可对该全局成分的内容模型进行查看和编辑。
)(3)在Company元素的Annotations字段[译注//即Company右边那个以ann:开头的字段]中输入对该元素的描述,比如这里我们输入Root element。
(4)点击菜单项File | Save6.9.2 定义名称空间您将要为XML文档实例定义一个目标命名空间。
(每个XML Schema文档都必须有对XML Schema命名空间的引用,而XMLSpy 2005会在您新建一个XML Schema文档时为您自动生成。
)(1)选择菜单项Schema Design | Schema settings[译注//该菜单项仅当主窗口处于Schema/WSDL设计视图时可用],此时将弹出Schema settings对话框。
如何用XMLSpy生成简洁代码如生成MACS-ATS_FILE.xsd的代码,由于定义Element和ComplexType的不同,导致生成的代码有差别。
自然,生成最少的代码来实现需求是最期待的。
为实现生成最少的代码,有以下几个原则:1.Node中有共同属性的情况下,抽象出一个属性类Attribute类。
其他类继承此类。
如Signal类继承了Attribute类。
2.当确认一个类型要被重用时,每个ComplexType类型对应一个同名字的Element。
例如Head没有被重用,可以不需要对应的Element,而Signal肯定被重用了,就是多处用到这个类型信息,那么就定义一个ComplexType和一个同名的Element。
Element的type选项即为ComplexType的Signal类型。
这样,只要XSD文件中用到Signal的地方都是添加一个Element,而且是引用类型。
注意到属性isRef被选上了。
这样定义自动生成的C++代码就最少,不出出现讨厌的Class2现象。
以下是Demo.xsd文件的截图。
所生成的所有类。
定义Attribute抽象类导致很好的代码复用。
举个例子,以下类时没有根据定义原则生成的,导致出现了较多类和Cobject2的现象。
定义少,但生成的类多。
在编辑后生成的类(同样完成设计要求)。
定义多,但生成的类少。
根据XMLSpy自动生成的代码,分析分析就会发现,其实完全可以通过一个类来处理xml文件,而可以抛开生成的这些类。
一个类XMLNode可以处理所有符合对应XSD文件的XML文件的读写。
--------------------------------------------------HPP文件--------------------------------------------------class XMLNode : public CNode{public:XMLNode() : CNode() {}XMLNode(xercesc::DOMNode* pThisNode) : CNode(pThisNode) {}XMLNode(xercesc::DOMDocument* pDoc) : CNode(pDoc) {}virtual ~XMLNode() {}static EGroupType GetGroupType();void AdjustPrefix();//// string StringValue//void AddStringValue(tstring strNodeName, CSchemaString StringValue);void InsertStringValueAt(tstring strNodeName, CSchemaString StringValue, int iIndex = 0);void ReplaceStringValueAt(tstring strNodeName, CSchemaString StringValue, int iIndex = 0); CSchemaString GetStringValueAt(tstring strNodeName, int iIndex = 0);CSchemaString GetStringValueAtCursor(xercesc::DOMNode* pCurNode);//// boolean BoolValue//void AddBoolValue(tstring strNodeName, CSchemaBoolean BoolValue);void InsertBoolValueAt(tstring strNodeName, CSchemaBoolean BoolValue, int iIndex = 0); void ReplaceBoolValueAt(tstring strNodeName, CSchemaBoolean BoolValue, int iIndex = 0); CSchemaBoolean GetBoolValueAt(tstring strNodeName, int iIndex = 0);CSchemaBoolean GetBoolValueAtCursor(xercesc::DOMNode* pCurNode);//// byte ByteValue//void AddByteValue(tstring strNodeName, CSchemaByte ByteValue);void InsertByteValueAt(tstring strNodeName, CSchemaByte ByteValue, int iIndex = 0);void ReplaceByteValueAt(tstring strNodeName, CSchemaByte ByteValue, int iIndex = 0); CSchemaByte GetByteValueAt(tstring strNodeName, int iIndex = 0);CSchemaByte GetByteValueAtCursor(xercesc::DOMNode* pCurNode);//// int IntValue//void AddIntValue(tstring strNodeName, CSchemaInt IntValue);void InsertIntValueAt(tstring strNodeName, CSchemaInt IntValue, int iIndex = 0);void ReplaceIntValueAt(tstring strNodeName, CSchemaInt IntValue, int iIndex = 0); CSchemaInt GetIntValueAt(tstring strNodeName, int iIndex = 0);CSchemaInt GetIntValueAtCursor(xercesc::DOMNode* pCurNode);//// float FloatValue//void AddFloatValue(tstring strNodeName, CSchemaFloat FloatValue);void InsertFloatValueAt(tstring strNodeName, CSchemaFloat FloatValue, int iIndex = 0); void ReplaceFloatValueAt(tstring strNodeName, CSchemaFloat FloatValue, int iIndex = 0); CSchemaFloat GetFloatValueAt(tstring strNodeName, int iIndex = 0);CSchemaFloat GetFloatValueAtCursor(xercesc::DOMNode* pCurNode);//// short ShortValue//void AddShortValue(tstring strNodeName, CSchemaShort ShortValue);void InsertShortValueAt(tstring strNodeName, CSchemaShort ShortValue, int iIndex = 0); void ReplaceShortValueAt(tstring strNodeName, CSchemaShort ShortValue, int iIndex = 0); CSchemaShort GetShortValueAt(tstring strNodeName, int iIndex = 0);CSchemaShort GetShortValueAtCursor(xercesc::DOMNode* pCurNode);//// long LongValue//void AddLongValue(tstring strNodeName, CSchemaLong LongValue);void InsertLongValueAt(tstring strNodeName, CSchemaLong LongValue, int iIndex = 0);void ReplaceLongValueAt(tstring strNodeName, CSchemaLong LongValue, int iIndex = 0); CSchemaLong GetLongValueAt(tstring strNodeName, int iIndex = 0);CSchemaLong GetLongValueAtCursor(xercesc::DOMNode* pCurNode);//// date DateValue//void AddDateValue(tstring strNodeName, CSchemaDate DateValue);void InsertDateValueAt(tstring strNodeName, CSchemaDate DateValue, int iIndex = 0);void ReplaceDateValueAt(tstring strNodeName, CSchemaDate DateValue, int iIndex = 0); CSchemaDate GetDateValueAt(tstring strNodeName, int iIndex = 0);CSchemaDate GetDateValueAtCursor(xercesc::DOMNode* pCurNode);//// time TimeValue//void AddTimeValue(tstring strNodeName, CSchemaTime TimeValue);void InsertTimeValueAt(tstring strNodeName, CSchemaTime TimeValue, int iIndex = 0);void ReplaceTimeValueAt(tstring strNodeName, CSchemaTime TimeValue, int iIndex = 0); CSchemaTime GetTimeValueAt(tstring strNodeName, int iIndex = 0);CSchemaTime GetTimeValueAtCursor(xercesc::DOMNode* pCurNode);//// dateTime DateTimeValue//void AddDateTimeValue(tstring strNodeName, CSchemaDateTime DateTimeValue);void InsertDateTimeValueAt(tstring strNodeName, CSchemaDateTime DateTimeValue, int iIndex = 0); void ReplaceDateTimeValueAt(tstring strNodeName, CSchemaDateTime DateTimeValue, int iIndex = 0); CSchemaDateTime GetDateTimeValueAt(tstring strNodeName, int iIndex = 0);CSchemaDateTime GetDateTimeValueAtCursor(xercesc::DOMNode* pCurNode);//// XMLNode XMLNodeValue//int GetCount(tstring strNodeName);bool Has(tstring strNodeName);xercesc::DOMNode* GetStartingCursor(tstring strNodeName);xercesc::DOMNode* GetAdvancedCursor(tstring strNodeName, xercesc::DOMNode* pCurNode);void RemoveAt(tstring strNodeName, int iIndex = 0);void Remove(tstring strNodeName);int GetXMLNodeCount(tstring strNodeName);bool HasXMLNode(tstring strNodeName);xercesc::DOMNode* GetStartingXMLNodeCursor(tstring strNodeName);xercesc::DOMNode* GetAdvancedXMLNodeCursor(tstring strNodeName, xercesc::DOMNode* pCurNode); void RemoveXMLNodeAt(tstring strNodeName, int iIndex = 0);void RemoveXMLNode(tstring strNodeName);void AddXMLNode(tstring strNodeName, XMLNode& theXMLNode);void InsertXMLNodeAt(tstring strNodeName, XMLNode& theXMLNode, int iIndex = 0);void ReplaceXMLNodeAt(tstring strNodeName, XMLNode& theXMLNode, int iIndex = 0);XMLNode GetXMLNodeAt(tstring strNodeName, int iIndex = 0);XMLNode GetXMLNodeValueAtCursor(xercesc::DOMNode* pCurNode);};--------------------------------------------------CPP文件--------------------------------------------------CNode::EGroupType XMLNode::GetGroupType(){return eSequence;}void XMLNode::AdjustPrefix(){//do nothing here.}/************************************************************************//* String StringValue *//************************************************************************/void XMLNode::AddStringValue(tstring strNodeName, CSchemaString StringValue){InternalAppend(Attribute, _T(""), _T(strNodeName), StringValue);}void XMLNode::InsertStringValueAt(tstring strNodeName, CSchemaString StringValue, int iIndex){InternalInsertAt(Attribute, _T(""), _T(strNodeName), iIndex, StringValue);}void XMLNode::ReplaceStringValueAt(tstring strNodeName, CSchemaString StringValue, int iIndex){InternalReplaceAt(Attribute, _T(""), _T(strNodeName), iIndex, StringValue);}CSchemaString XMLNode::GetStringValueAt(tstring strNodeName, int iIndex){return InternalGetNodeValue(Attribute, InternalGetAt(Attribute, _T(""), _T(strNodeName), iIndex)).c_str(); }CSchemaString XMLNode::GetStringValueAtCursor(xercesc::DOMNode* pCurNode){if( pCurNode == NULL )throw CXmlException(CXmlException::eError1, _T("Index out of range"));else{if(pCurNode->getNodeType() == xercesc::DOMNode::ELEMENT_NODE){xercesc::DOMNode* pChildNode = pCurNode->getFirstChild();if( !pChildNode )return _T("");if(pChildNode->getNodeValue())return XC2TS(pChildNode->getNodeValue());elsereturn _T("");}else{if( pCurNode->getNodeValue() )return XC2TS(pCurNode->getNodeValue());elsereturn _T("");}}}/************************************************************************//* Bool BoolValue *//************************************************************************/void XMLNode::AddBoolValue(tstring strNodeName, CSchemaBoolean BoolValue){InternalAppend(Attribute, _T(""), _T(strNodeName), BoolValue);}void XMLNode::InsertBoolValueAt(tstring strNodeName, CSchemaBoolean BoolValue, int iIndex){InternalInsertAt(Attribute, _T(""), _T(strNodeName), iIndex, BoolValue);}void XMLNode::ReplaceBoolValueAt(tstring strNodeName, CSchemaBoolean BoolValue, int iIndex){InternalReplaceAt(Attribute, _T(""), _T(strNodeName), iIndex, BoolValue);}CSchemaBoolean XMLNode::GetBoolValueAt(tstring strNodeName, int iIndex){return InternalGetNodeValue(Attribute, InternalGetAt(Attribute, _T(""), _T(strNodeName), iIndex)).c_str(); }CSchemaBoolean XMLNode::GetBoolValueAtCursor(xercesc::DOMNode* pCurNode){if( pCurNode == NULL )throw CXmlException(CXmlException::eError1, _T("Index out of range"));else{if(pCurNode->getNodeType() == xercesc::DOMNode::ELEMENT_NODE){xercesc::DOMNode* pChildNode = pCurNode->getFirstChild();if( !pChildNode )return _T("");if(pChildNode->getNodeValue())return XC2TS(pChildNode->getNodeValue());elsereturn _T("");}else{if( pCurNode->getNodeValue() )return XC2TS(pCurNode->getNodeValue());elsereturn _T("");}}}/************************************************************************//* Byte ByteValue *//************************************************************************/void XMLNode::AddByteValue(tstring strNodeName, CSchemaByte ByteValue){InternalAppend(Attribute, _T(""), _T(strNodeName), ByteValue);}void XMLNode::InsertByteValueAt(tstring strNodeName, CSchemaByte ByteValue, int iIndex){InternalInsertAt(Attribute, _T(""), _T(strNodeName), iIndex, ByteValue);}void XMLNode::ReplaceByteValueAt(tstring strNodeName, CSchemaByte ByteValue, int iIndex){InternalReplaceAt(Attribute, _T(""), _T(strNodeName), iIndex, ByteValue);}CSchemaByte XMLNode::GetByteValueAt(tstring strNodeName, int iIndex){return InternalGetNodeValue(Attribute, InternalGetAt(Attribute, _T(""), _T(strNodeName), iIndex)).c_str(); }CSchemaByte XMLNode::GetByteValueAtCursor(xercesc::DOMNode* pCurNode){if( pCurNode == NULL )throw CXmlException(CXmlException::eError1, _T("Index out of range"));else{if(pCurNode->getNodeType() == xercesc::DOMNode::ELEMENT_NODE){xercesc::DOMNode* pChildNode = pCurNode->getFirstChild();if( !pChildNode )return _T("");if(pChildNode->getNodeValue())return XC2TS(pChildNode->getNodeValue());elsereturn _T("");}else{if( pCurNode->getNodeValue() )return XC2TS(pCurNode->getNodeValue());elsereturn _T("");}}}/************************************************************************//* Int IntValue *//************************************************************************/void XMLNode::AddIntValue(tstring strNodeName, CSchemaInt IntValue){InternalAppend(Attribute, _T(""), _T(strNodeName), IntValue);}void XMLNode::InsertIntValueAt(tstring strNodeName, CSchemaInt IntValue, int iIndex) {InternalInsertAt(Attribute, _T(""), _T(strNodeName), iIndex, IntValue);}void XMLNode::ReplaceIntValueAt(tstring strNodeName, CSchemaInt IntValue, int iIndex) {InternalReplaceAt(Attribute, _T(""), _T(strNodeName), iIndex, IntValue);}CSchemaInt XMLNode::GetIntValueAt(tstring strNodeName, int iIndex){return InternalGetNodeValue(Attribute, InternalGetAt(Attribute, _T(""), _T(strNodeName), iIndex)).c_str(); }CSchemaInt XMLNode::GetIntValueAtCursor(xercesc::DOMNode* pCurNode){if( pCurNode == NULL )throw CXmlException(CXmlException::eError1, _T("Index out of range"));else{if(pCurNode->getNodeType() == xercesc::DOMNode::ELEMENT_NODE){xercesc::DOMNode* pChildNode = pCurNode->getFirstChild();if( !pChildNode )return _T("");if(pChildNode->getNodeValue())return XC2TS(pChildNode->getNodeValue());elsereturn _T("");}else{if( pCurNode->getNodeValue() )return XC2TS(pCurNode->getNodeValue());elsereturn _T("");}}}/************************************************************************//* Float FloatValue *//************************************************************************/void XMLNode::AddFloatValue(tstring strNodeName, CSchemaFloat FloatValue){InternalAppend(Attribute, _T(""), _T(strNodeName), FloatValue);}void XMLNode::InsertFloatValueAt(tstring strNodeName, CSchemaFloat FloatValue, int iIndex){InternalInsertAt(Attribute, _T(""), _T(strNodeName), iIndex, FloatValue);}void XMLNode::ReplaceFloatValueAt(tstring strNodeName, CSchemaFloat FloatValue, int iIndex){InternalReplaceAt(Attribute, _T(""), _T(strNodeName), iIndex, FloatValue);}CSchemaFloat XMLNode::GetFloatValueAt(tstring strNodeName, int iIndex){return InternalGetNodeValue(Attribute, InternalGetAt(Attribute, _T(""), _T(strNodeName), iIndex)).c_str(); }CSchemaFloat XMLNode::GetFloatValueAtCursor(xercesc::DOMNode* pCurNode){if( pCurNode == NULL )throw CXmlException(CXmlException::eError1, _T("Index out of range"));else{if(pCurNode->getNodeType() == xercesc::DOMNode::ELEMENT_NODE){xercesc::DOMNode* pChildNode = pCurNode->getFirstChild();if( !pChildNode )return _T("");if(pChildNode->getNodeValue())return XC2TS(pChildNode->getNodeValue());elsereturn _T("");}else{if( pCurNode->getNodeValue() )return XC2TS(pCurNode->getNodeValue());elsereturn _T("");}}}/************************************************************************//* Short ShortValue *//************************************************************************/void XMLNode::AddShortValue(tstring strNodeName, CSchemaShort ShortValue){InternalAppend(Attribute, _T(""), _T(strNodeName), ShortValue);}void XMLNode::InsertShortValueAt(tstring strNodeName, CSchemaShort ShortValue, int iIndex){InternalInsertAt(Attribute, _T(""), _T(strNodeName), iIndex, ShortValue);}void XMLNode::ReplaceShortValueAt(tstring strNodeName, CSchemaShort ShortValue, int iIndex){InternalReplaceAt(Attribute, _T(""), _T(strNodeName), iIndex, ShortValue);CSchemaShort XMLNode::GetShortValueAt(tstring strNodeName, int iIndex){return InternalGetNodeValue(Attribute, InternalGetAt(Attribute, _T(""), _T(strNodeName), iIndex)).c_str(); }CSchemaShort XMLNode::GetShortValueAtCursor(xercesc::DOMNode* pCurNode){if( pCurNode == NULL )throw CXmlException(CXmlException::eError1, _T("Index out of range"));else{if(pCurNode->getNodeType() == xercesc::DOMNode::ELEMENT_NODE){xercesc::DOMNode* pChildNode = pCurNode->getFirstChild();if( !pChildNode )return _T("");if(pChildNode->getNodeValue())return XC2TS(pChildNode->getNodeValue());elsereturn _T("");}else{if( pCurNode->getNodeValue() )return XC2TS(pCurNode->getNodeValue());elsereturn _T("");}}}/************************************************************************//* Long LongValue *//************************************************************************/void XMLNode::AddLongValue(tstring strNodeName, CSchemaLong LongValue){InternalAppend(Attribute, _T(""), _T(strNodeName), LongValue);}void XMLNode::InsertLongValueAt(tstring strNodeName, CSchemaLong LongValue, int iIndex){InternalInsertAt(Attribute, _T(""), _T(strNodeName), iIndex, LongValue);}void XMLNode::ReplaceLongValueAt(tstring strNodeName, CSchemaLong LongValue, int iIndex)InternalReplaceAt(Attribute, _T(""), _T(strNodeName), iIndex, LongValue);}CSchemaLong XMLNode::GetLongValueAt(tstring strNodeName, int iIndex){return InternalGetNodeValue(Attribute, InternalGetAt(Attribute, _T(""), _T(strNodeName), iIndex)).c_str(); }CSchemaLong XMLNode::GetLongValueAtCursor(xercesc::DOMNode* pCurNode){if( pCurNode == NULL )throw CXmlException(CXmlException::eError1, _T("Index out of range"));else{if(pCurNode->getNodeType() == xercesc::DOMNode::ELEMENT_NODE){xercesc::DOMNode* pChildNode = pCurNode->getFirstChild();if( !pChildNode )return _T("");if(pChildNode->getNodeValue())return XC2TS(pChildNode->getNodeValue());elsereturn _T("");}else{if( pCurNode->getNodeValue() )return XC2TS(pCurNode->getNodeValue());elsereturn _T("");}}}/************************************************************************//* Date DateValue *//************************************************************************/void XMLNode::AddDateValue(tstring strNodeName, CSchemaDate DateValue){InternalAppend(Attribute, _T(""), _T(strNodeName), DateValue);}void XMLNode::InsertDateValueAt(tstring strNodeName, CSchemaDate DateValue, int iIndex){InternalInsertAt(Attribute, _T(""), _T(strNodeName), iIndex, DateValue);}void XMLNode::ReplaceDateValueAt(tstring strNodeName, CSchemaDate DateValue, int iIndex){InternalReplaceAt(Attribute, _T(""), _T(strNodeName), iIndex, DateValue);}CSchemaDate XMLNode::GetDateValueAt(tstring strNodeName, int iIndex){return InternalGetNodeValue(Attribute, InternalGetAt(Attribute, _T(""), _T(strNodeName), iIndex)).c_str(); }CSchemaDate XMLNode::GetDateValueAtCursor(xercesc::DOMNode* pCurNode){if( pCurNode == NULL )throw CXmlException(CXmlException::eError1, _T("Index out of range"));else{if(pCurNode->getNodeType() == xercesc::DOMNode::ELEMENT_NODE){xercesc::DOMNode* pChildNode = pCurNode->getFirstChild();if( !pChildNode )return _T("");if(pChildNode->getNodeValue())return XC2TS(pChildNode->getNodeValue());elsereturn _T("");}else{if( pCurNode->getNodeValue() )return XC2TS(pCurNode->getNodeValue());elsereturn _T("");}}}/************************************************************************//* Time TimeValue *//************************************************************************/void XMLNode::AddTimeValue(tstring strNodeName, CSchemaTime TimeValue){InternalAppend(Attribute, _T(""), _T(strNodeName), TimeValue);}void XMLNode::InsertTimeValueAt(tstring strNodeName, CSchemaTime TimeValue, int iIndex){InternalInsertAt(Attribute, _T(""), _T(strNodeName), iIndex, TimeValue);}void XMLNode::ReplaceTimeValueAt(tstring strNodeName, CSchemaTime TimeValue, int iIndex){InternalReplaceAt(Attribute, _T(""), _T(strNodeName), iIndex, TimeValue);}CSchemaTime XMLNode::GetTimeValueAt(tstring strNodeName, int iIndex){return InternalGetNodeValue(Attribute, InternalGetAt(Attribute, _T(""), _T(strNodeName), iIndex)).c_str(); }CSchemaTime XMLNode::GetTimeValueAtCursor(xercesc::DOMNode* pCurNode){if( pCurNode == NULL )throw CXmlException(CXmlException::eError1, _T("Index out of range"));else{if(pCurNode->getNodeType() == xercesc::DOMNode::ELEMENT_NODE){xercesc::DOMNode* pChildNode = pCurNode->getFirstChild();if( !pChildNode )return _T("");if(pChildNode->getNodeValue())return XC2TS(pChildNode->getNodeValue());elsereturn _T("");}else{if( pCurNode->getNodeValue() )return XC2TS(pCurNode->getNodeValue());elsereturn _T("");}}}/************************************************************************//* DateTime DateTimeValue *//************************************************************************/void XMLNode::AddDateTimeValue(tstring strNodeName, CSchemaDateTime DateTimeValue){InternalAppend(Attribute, _T(""), _T(strNodeName), DateTimeValue);}void XMLNode::InsertDateTimeValueAt(tstring strNodeName, CSchemaDateTime DateTimeValue, int iIndex){InternalInsertAt(Attribute, _T(""), _T(strNodeName), iIndex, DateTimeValue);}void XMLNode::ReplaceDateTimeValueAt(tstring strNodeName, CSchemaDateTime DateTimeValue, int iIndex){InternalReplaceAt(Attribute, _T(""), _T(strNodeName), iIndex, DateTimeValue);}CSchemaDateTime XMLNode::GetDateTimeValueAt(tstring strNodeName, int iIndex){return InternalGetNodeValue(Attribute, InternalGetAt(Attribute, _T(""), _T(strNodeName), iIndex)).c_str(); }CSchemaDateTime XMLNode::GetDateTimeValueAtCursor(xercesc::DOMNode* pCurNode){if( pCurNode == NULL )throw CXmlException(CXmlException::eError1, _T("Index out of range"));else{if(pCurNode->getNodeType() == xercesc::DOMNode::ELEMENT_NODE){xercesc::DOMNode* pChildNode = pCurNode->getFirstChild();if( !pChildNode )return _T("");if(pChildNode->getNodeValue())return XC2TS(pChildNode->getNodeValue());elsereturn _T("");}else{if( pCurNode->getNodeValue() )return XC2TS(pCurNode->getNodeValue());elsereturn _T("");}}}/************************************************************************//* XMLNode XMLNodeValue *//************************************************************************/int XMLNode::GetCount(tstring strNodeName){return ChildCountInternal(Attribute, _T(""), strNodeName);}bool XMLNode::Has(tstring strNodeName){return InternalHasChild(Attribute, _T(""), strNodeName);}xercesc::DOMNode* XMLNode::GetStartingCursor(tstring strNodeName){return InternalGetFirstChild(Attribute, _T(""), strNodeName);}xercesc::DOMNode* XMLNode::GetAdvancedCursor(tstring strNodeName, xercesc::DOMNode* pCurNode){return InternalGetNextChild(Element, _T(""), _T(strNodeName), pCurNode);}void XMLNode::RemoveAt(tstring strNodeName, int iIndex){InternalRemoveAt(Attribute, _T(""), _T(strNodeName), iIndex);}void XMLNode::Remove(tstring strNodeName){while (Has(strNodeName))RemoveAt(strNodeName, 0);}int XMLNode::GetXMLNodeCount(tstring strNodeName){return ChildCountInternal(Element, _T(""), strNodeName);}bool XMLNode::HasXMLNode(tstring strNodeName){return InternalHasChild(Element, _T(""), strNodeName);}xercesc::DOMNode* XMLNode::GetStartingXMLNodeCursor(tstring strNodeName){return InternalGetFirstChild(Element, _T(""), strNodeName);}xercesc::DOMNode* XMLNode::GetAdvancedXMLNodeCursor(tstring strNodeName, xercesc::DOMNode* pCurNode) {return InternalGetNextChild(Element, _T(""), _T(strNodeName), pCurNode);}void XMLNode::RemoveXMLNodeAt(tstring strNodeName,int iIndex){InternalRemoveAt(Element, _T(""), _T(strNodeName), iIndex);}void XMLNode::RemoveXMLNode(tstring strNodeName){while (HasXMLNode(strNodeName))RemoveXMLNodeAt(strNodeName, 0);}void XMLNode::AddXMLNode(tstring strNodeName, XMLNode& theXMLNode){InternalAppendNode(_T(""), _T(strNodeName), theXMLNode);}void XMLNode::InsertXMLNodeAt(tstring strNodeName, XMLNode& theXMLNode, int iIndex) {InternalInsertNodeAt(_T(""), _T(strNodeName), iIndex, theXMLNode);}void XMLNode::ReplaceXMLNodeAt(tstring strNodeName, XMLNode& theXMLNode, int iIndex) {InternalReplaceNodeAt(_T(""), _T(strNodeName), iIndex, theXMLNode);}XMLNode XMLNode::GetXMLNodeAt(tstring strNodeName, int iIndex){return XMLNode(InternalGetAt(Element, _T(""), _T(strNodeName), iIndex));}XMLNode XMLNode::GetXMLNodeValueAtCursor(xercesc::DOMNode* pCurNode){if( pCurNode == NULL )throw CXmlException(CXmlException::eError1, _T("Index out of range"));else{return XMLNode(pCurNode);}}。
xmlspy教程第十五步新建一个XML文件
15新建一个XML文件
当您在XMLSpy 2005中新建XML文件时,您可以选择令该文件基于某个schema(DTD或XML Schema)。
本节,您将新建一个基于AddressLast.xsd(即您在本教程前面部分已创建的那个schema)的XML文件。
按如下步骤新建该XML文件:
1.选择菜单项File | New。
这时将出现一个对话框:
2.在对话框中选择.xml XML Document然后点击OK确认。
这时将出现一个提示,让
您选择该XML文档是否要基于某个DTD或Schema。
3.选择Schema,然后点击OK确认。
接着将出现一个对话框,让您选择该XML文档基
于的schema文件。
4.您可以通过点击Browse或Window按钮来选择schema文件。
点击Browser按钮用于
在文件系统中定位文件,点击Window按钮用于在已创建的工程以及所有已打开文件中选择文件。
用上述任一方式选择AddressLast.xsd文件,然后点击OK确认。
这时主窗口中将出现新建的XML文档,其中已经包含了在AddressLast.xsd中定义的主要元素。
5.进入增强型Grid视图。
6.在Grid视图中单击任意一个元素以缩小选中范围(这样可以看得更清楚一些),如下
图所示。
7.点击Address旁的图标,以查看其子元素(如下图所示)。
一、安装
1、安装XMLSpyEnt (可以从各网站进行下载),总部这边使用的是XMLSpyEnt2009版本。
点击XMLSpyEnt2009.exe进行安装,步骤如下:
点击Next:
点击Next:
选择I accept……后,点击Next:
点击Next:
选择Complete,点击Next:
点击Install:
点击Finish,安装成功:
二、注册
说明:如下载版本为注册版,可不用执行该部分。
1、安装完成后,点击桌面图表后,点击注册机keygen.exe,进行注册。
注:注册时
请断开外网,等注册成功后,外网才可用。
三、使用
1、注册成功后,点击图标进入页面。
2、点击页面上的open快捷键,打开本地目录,点击要编译的xml文件。
选择文件后,点击“打开”按钮。
3、打开文件后,选择工具栏中的“DTD/Schema”下的“Assign Schema”,进入选择添加
xsd文件。
步骤如下:
点击确定
点击“Browse”选择xsd所在的位置,点击“打开”即可
注:根据不同文件类型,选择相对应的xsd文件,如文件类型为EVENT,所对应的xsd文件为bomc_event.xsd。
4、正确打开xsd文件后,文件中的头部分会出现一行信息,如下:
<bomc xmlns:xsi="" xsi:noNamespaceSchemaLocation="D:\BOMC\40_全国监控中心\00_需求\01_BOMC二期\xsd\bomc_event.xsd">
5、点击Validate图标,进行Schema校验。
6、如通过Schema校验,Messages中会显示以下信息:
7、如Schema校验出现错误,Messages中会显示以下信息:
出现错误后,可点击DEF进行错误位置的查找。
点击DEF后,会将所对应类型的XSD文件打开,显示蓝色部分的,就是出现错误的位置,可根据该信息进行修改,例如:
上图说明出错的位置在bomc下。
根据报错提示的信息可以得出Createtime位置错误,根据xsd文件规则进行修改。
注:该编译工具只显示xml文件中的第一个Schema校验错误位置,如检查xml文件中是否还含有其他错误,请将出现错误的位置修改正确,然后在点击Validate图标,进行Schema校验,以此类推,直至该xml文件的Schema校验正确。