下面是测试用例:
//从schema文件和xml文件反序列化成一个SDO对象
DataObjectPtr generateSDOFromFile(const char* xsdFileUri, const char* xmlFileUri,const char* nameSpace = "")
{
DataObjectPtr root=NULL;
try
{
DataFactoryPtr mdg=DataFactory::getDataFactory();
XSDHelperPtr xsdHelper=HelperProvider::getXSDHelper(mdg);
string rootTypeURI = xsdHelper->defineFile(xsdFileUri);
XMLHelperPtr xmlHelper = HelperProvider::getXMLHelper(mdg);
XMLDocumentPtr xmlDoc=xmlHelper->loadFile(xmlFileUri,nameSpace);
root=xmlDoc->getRootDataObject();
}
catch(SDORuntimeException e)
{
cout << "Exception in generateSDOFromFile"<< endl;
}
catch(…)
{
cout<<”…Exception in generateSDOFromFile”<<endl;
}
return root;
}
void testSDOXsdBug()
{
DataObjectPtr company = generateSDOFromFile("company2.xsd", "company2.xml");
cout<<"aname = "<<company->getCString("aname")<<endl;
cout<<"ename = "<<company->getCString("ename")<<endl;
generateXsdFile(company, "generatedCompany2.xsd");//使用未更正的tuscany_sdo.dll 与company2.xsd不一致 anme属性变成了aname元素
generateXmlFile(company, "generatedCompany2.xml", "company");//与company2.xml一致
}
//从SDO对象中构造schema文件
void generateXsdFile(DataObjectPtr dataObject,const char* xsdFileUri, const char* targetNamespace = "")
{
try
{
DataFactoryPtr mdg = DataFactory::getDataFactory();
mdg = dataObject->getDataFactory();
XSDHelperPtr xsdHelper = HelperProvider::getXSDHelper(mdg);
TypeList tList = mdg->getTypes( );
cout<<"generateXsdFile: before generateFile"<<endl;
xsdHelper->generateFile(tList,xsdFileUri,targetNamespace);
cout<<"generateXsdFile: before generateFile"<<endl;
}
catch(SDORuntimeException e)
{
cout<<"Exception in generateXsdFile "<< endl;
cout<< e<<endl;
}
catch(…)
{
cout<<"…Exception in generateXsdFile "<< endl;
}
}
//-------------company2.xsd
/*
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xs:element name="company">
<xs:complexType>
<xs:sequence>
<xs:element name="ename" type="xs:string"/>
</xs:sequence>
<xs:attribute name="aname" type="xs:string"/>
</xs:complexType>
</xs:element>
</xs:schema>
*/
//-------------generatedCompany2.xsd (使用原始的tuscany_sdo.dll)
/*
<xsd:schema xmlns:sdo="commonj.sdo" xmlns:sdoxml="commonj.sdo/xml" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="company" type="company"/>
<xsd:complexType name="company">
<xsd:sequence>
<xsd:element name="ename" type="xsd:String" minOccurs="0"/>
<xsd:element name="aname" type="xsd:String" minOccurs="0"/>
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
*/
//----------company2.xml
/*
<?xml version="1.0" encoding="UTF-8"?>
<company aname = "aname">
<ename>ename</ename>
</company>
*/
//----------generatedCompany2.xml
/*
<?xml version="1.0" encoding="UTF-8"?>
<company xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" aname="aname">
<ename>ename</ename>
</company>
*/
3.4 解决方案
前后两个schema文件不一致的原因是在从shema文件构造SDO对象时,遇到attribute,构造成的property的bisContainment属性没有重置为false,该属性的默认值为true。所以在从这个SDO对象生成schema文件时,property会被构造为element,而不是attribute。
在补丁程序中,只要在从attribute构造SDO对象的property时,将其bisContainment属性设为false即可。
下面是更正的方法,只在语句thisProperty.isElement = false;后添加了thisProperty.isContainment = false;语句:
void SDOSchemaSAX2Parser::startAttribute(
const SDOXMLString& localname,
const SDOXMLString& prefix,
const SDOXMLString& URI,
const SAX2Namespaces& namespaces,
const SAX2Attributes& attributes)
{
LOGINFO_1( INFO,"SchemaParser:startAttribute:%s",(const char*)localname);
if (!bInSchema) return;
PropertyDefinitionImpl thisProperty;
thisProperty.isElement = false;
thisProperty.isContainment = false; //!!!!!! new added. The default value of isContaintment is true. !!!!!!
setName(attributes,
thisProperty.name,
thisProperty.localname);
thisProperty.namespaceURI = schemaInfo.getTargetNamespaceURI();
setType(thisProperty, attributes, namespaces);
setCurrentProperty(thisProperty);
}
使用改正后的tuscany_sdo构造的shcema文件为:
//-------------generatedCompany2.xsd (使用改正后的 tuscany_sdo.dll)
/*
<xsd:schema xmlns:sdo="commonj.sdo" xmlns:sdoxml="commonj.sdo/xml" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="company" type="company"/>
<xsd:complexType name="company">
<xsd:sequence>
<xsd:element name="ename" type="xsd:String" minOccurs="0"/>
</xsd:sequence>
<xsd:attribute name="aname" type="xsd:String"/>
</xsd:complexType>
</xsd:schema>
*/
这就与原来的company2.xsd文件保持一致了。
分享到:
相关推荐
在C++版的Tuscany SDO中,这个概念被实现为一个库,允许C++开发者轻松地处理和操作数据。 **SDO的核心特性** 1. **统一的数据模型**:SDO定义了一种统一的数据模型,无论数据来源何处,如数据库、XML文件或Web服务...
### Tuscany-SDO-学习笔记 #### 1. SDO基础知识 ##### 1.1 创建DataObject **1.1.1 动态定义类型,然后创建DataObject** 在这一节中,我们将探讨如何通过动态定义类型来创建DataObject。这种方式允许我们在运行...
标题中的“tuscany-das&sdo&distribution-all.zip”提到了三个关键概念:Tuscany Data Access Service (Tuscany DAS),Service Data Objects (SDO) 和 Distribution。这表明该压缩包可能包含了与这些技术相关的软件...
自制CHM版的API文档,带索引。 注:如果各位下载后打开或无法显示页面,请在CHM文件右键—属性—解除锁定即可。
在这个“Tuscany发布Web服务实例”中,我们将深入探讨如何利用Tuscany来配置和发布一个简单的Web服务接口。 1. **Tuscany简介** Tuscany的设计目标是支持多种服务交互协议和服务模型,如SOAP、REST、JMS等,并且...
5. 接下来,点击`Add JARs`按钮,浏览并选择所有位于`E:\tuscany-sdo-1.0-incubating-beta1\lib`目录下的JAR文件,将它们添加到用户库中。 完成上述步骤后,我们已经成功创建了一个包含所有必要SDO组件的用户库。 ...
【压缩包子文件的文件名称列表】中的 "tuscany-sca-1.6.2-src" 表明这是Apache Tuscany SCA框架的1.6.2版本的源代码文件。源代码对于开发者来说至关重要,因为它提供了项目的原始构建块,允许他们深入理解代码的工作...
Tuscany源码的分析有助于深入理解SCA的工作原理以及如何在实际开发中应用这一框架。 SCA的核心概念包括组件、服务、绑定和配置。组件是应用程序的基本单元,可以提供或消费服务。服务是组件对外提供的接口,供其他...
Tuscany是一个开源的服务组合架构(Service Component Architecture, SCA)实现,它提供了一种方式来管理和控制应用程序中与业务逻辑正交的方面,比如日志、监控和安全性。策略在Tuscany和SCA中扮演着关键角色,它们...
在“Apache Tuscany SCA 用户指南StepByStep”中,读者可以期待获得以下关键知识点: 1. **SCA基础概念**:首先,你需要理解SCA的核心概念,包括组件(Component)、服务(Service)、引用(Reference)和绑定...
由于压缩包中已删除了`lib`文件夹中的jar,你需要手动添加这些依赖到你的项目类路径中,包括Tuscany的SCA实现、Spring的核心库和Hibernate的JAR文件。 2. **创建SCA组件**:定义SCA组件,这些组件可以是Spring Bean...
Tuscany架构 Tuscany架构.jpg Tuscany架构.jpg
实现SDO需要在项目中引入相应的库,如Apache Tuscany,它是开源实现SDO的一个重要框架。配置完成后,可以通过创建数据图和数据对象来开始数据访问操作。 1. **Apache Tuscany的Java SDO** - **将XML转换为Data ...
在“apache-tuscany-sca-1.6.2”这个压缩包中,我们能找到Apache Tuscany的特定版本——1.6.2。这个版本包含了项目的所有源代码,这对于开发者来说是极其宝贵的资源,因为源码可以提供深入理解其内部工作原理的机会...
《Tuscany SCA在行动》一书深入探讨了Service Component Architecture(SCA)与Apache Tuscany项目,这是IT领域内对服务组件架构及其实现的重要研究资料。以下是基于标题、描述、部分目录和标签生成的相关IT知识点:...
2. **示例代码**:实例中可能包含了演示如何使用Apache Tuscany创建和部署SCA组件的代码。这些代码可能包括服务组件、绑定接口和服务配置文件。 3. **文档**:除了代码,可能还附带了详细的文档,解释了如何理解和...
tuscany wsdl2java tools
根据提供的文件信息,本文将详细解析Tuscany与Spring、Axis整合的相关知识点,以及如何解决在整合过程中可能遇到的jar包冲突问题。 ### Tuscany简介 Tuscany项目是Apache软件基金会的一个顶级项目,专注于提供一个...
5个代码例子使用的是 Tuscany1.5版本。请在官网下载jar包。 下载地址:http://archive.apache.org/dist/tuscany/java/sca/1.5/apache-tuscany-sca-1.5.zip 5个例子从不同的角度讲解了tuscany的整体架构思想。文档...