老师好,我想确定一下,是不是用mdlxxx系列的函数创建一个简单的类似这样的内容,是不是不能实现呢?必须要使用C++中相关的函数实现,和MicroStationAPI没有关系啊?
原则上来说,mdlXML系列的函数可以创建任何的XML内容的。需要你对XML基本知识首先要有正确的理解。
我抽空给你写个样例吧。
非常感谢 符工,太好了 谢谢
代码如下:
void tempTest() { XmlDomRef domRef = NULL; XmlNodeRef rootNodeRef = NULL; XmlNodeRef lvl1NodeRef = NULL, lvl2NodeRef = NULL, lvl3NodeRef = NULL; mdlXMLDom_createWithParameters (&domRef, FALSE, FALSE, FALSE, FALSE, FALSE); mdlXMLDom_createElement (&rootNodeRef, domRef, L"ECSchema"); mdlXMLDomElement_addAttribute (rootNodeRef, XMLDATATYPE_WIDESTRING, L"schemaName", L"Sample"); mdlXMLDomElement_addAttribute (rootNodeRef, XMLDATATYPE_WIDESTRING, L"nameSpacePrefix", L"SA"); mdlXMLDomElement_addAttribute (rootNodeRef, XMLDATATYPE_WIDESTRING, L"version", L"1.0"); mdlXMLDomElement_addAttribute (rootNodeRef, XMLDATATYPE_WIDESTRING, L"xmlns", L"http://www.bentley.com/schemas/Bentley.ECXML.2.0"); mdlXMLDom_setRootElement (domRef, rootNodeRef); mdlXMLDom_createElement (&lvl1NodeRef, domRef, L"ECSchemaReference"); mdlXMLDomElement_addAttribute (lvl1NodeRef, XMLDATATYPE_WIDESTRING, L"name", L"Bentley_Standard_CustomAttributes"); mdlXMLDomElement_addAttribute (lvl1NodeRef, XMLDATATYPE_WIDESTRING, L"version", L"1.0"); mdlXMLDomElement_addAttribute (lvl1NodeRef, XMLDATATYPE_WIDESTRING, L"prefix", L"bsca"); mdlXMLDomElement_appendChild (rootNodeRef, lvl1NodeRef); mdlXMLDom_save (domRef, FILESPEC_LOCAL, L"d:\\test.ecschema.xml", NULL, NULL, L"utf-8", TRUE, TRUE, TRUE); mdlXMLDomNode_free (rootNodeRef); mdlXMLDom_free (domRef); }
创建出的XML文件内容如下:
<?xml version="1.0" encoding="utf-8"?> <ECSchema schemaName="Sample" nameSpacePrefix="SA" version="1.0" xmlns="http://www.bentley.com/schemas/Bentley.ECXML.2.0"> <ECSchemaReference name="Bentley_Standard_CustomAttributes" version="1.0" prefix="bsca" xmlns=""/> </ECSchema>
想必你看完这个后面的内容可以“照猫画虎”了吧?
符工,我也是这样建的代码也是这样的,部分如下:
//创建ECshema XmlDomRef pDom=NULL; XmlNodeRef pRootNode=NULL; int status ; if (SUCCESS!=mdlXMLDom_createWithParameters(&pDom, FALSE, FALSE, FALSE, FALSE, FALSE)) return; //定义ECShema数据库定义 mdlXMLDom_createElement (&pRootNode,pDom,L"ECSchema"); mdlXMLDom_setRootElement(pDom,pRootNode);
status =mdlXMLElement_addAttribute(pRootNode,XMLDATATYPE_STRING,L"schemaName","AdventureWork"); status =mdlXMLElement_addAttribute(pRootNode,XMLDATATYPE_STRING,L"nameSpacePrefix","AW"); status =mdlXMLElement_addAttribute(pRootNode,XMLDATATYPE_STRING,L"version","2.0"); status =mdlXMLElement_addAttribute(pRootNode,XMLDATATYPE_STRING,L"xmlns","www.bentley.com/.../Bentley.ECXML.2.0"); //定义ECSchemaReference的定义 XmlNodeRef pPersonNode=NULL; mdlXMLDom_createNode(&pPersonNode,pDom,1,L"ECSchemaReference",L""); status =mdlXMLElement_addAttribute(pPersonNode,XMLDATATYPE_STRING,L"name","Bentley_Standard_CustomAttributes"); status =mdlXMLElement_addAttribute(pPersonNode,XMLDATATYPE_STRING,L"version","01.00"); status =mdlXMLElement_addAttribute(pPersonNode,XMLDATATYPE_STRING,L"prefix","bsca"); mdlXMLElement_appendChild(pRootNode,pPersonNode);
但是我现在遇到的问题是这部分内容不知道该怎么创建,我使用类编辑创建一个简单的xml文件发现有这部分内容,用类编辑创建的XML文件添加到模型中就成功了, 我自己编写代码没有编写这部分,发现添加属性的时候没有成功?
使用类编辑创建简单一个xml文件,发现有这部分内容, 我测试了一下,发现编写代码生成xml(这部分不添加的话),然后使用 schemaManager.AddSchema(WString("D:\\xmls\\Sample.01.00.ecschema.xml"),1, 0); apiRef.CreateInstance (istatus, elRef, getXmlInstanceFragment());//在定义好的表中定义表的内容 if (XML_INSTANCE_SUCCESS == istatus.status) mdlDialog_dmsgsPrint ("Append XAttributes successfully!"); else mdlDialog_dmsgsPrint ("Fail to append XAttributes."); mdlSystem_freeCfgVarBuffer (dataLocationPath);发现属性添加失败, 我对比了一下,发现使用类编辑创建的xml文档和用代码编写的xml差别就在于这部分,但是这部分我不知道该怎么用代码创建?
我发现我创建的XML中也是有xmlns=""。后来经过研究发现用mdlXMLDom_addElementUsingNamespace函数添加元素时可避免子节点带有空的xmlns。修改后的代码如下:
void tempTest() { XmlDomRef domRef = NULL; XmlNodeRef rootNodeRef = NULL; XmlNodeRef lvl1NodeRef = NULL, lvl2NodeRef = NULL, lvl3NodeRef = NULL; MSWChar* xmlns = L"http://www.bentley.com/schemas/Bentley.ECXML.2.0"; mdlXMLDom_createWithParameters (&domRef, FALSE, FALSE, FALSE, FALSE, FALSE); mdlXMLDom_createElement (&rootNodeRef, domRef, L"ECSchema"); mdlXMLDom_setRootElement (domRef, rootNodeRef); mdlXMLDomElement_addAttribute (rootNodeRef, XMLDATATYPE_WIDESTRING, L"schemaName", L"Sample"); mdlXMLDomElement_addAttribute (rootNodeRef, XMLDATATYPE_WIDESTRING, L"nameSpacePrefix", L"SA"); mdlXMLDomElement_addAttribute (rootNodeRef, XMLDATATYPE_WIDESTRING, L"version", L"1.0"); mdlXMLDomElement_addAttribute (rootNodeRef, XMLDATATYPE_WIDESTRING, L"xmlns", xmlns); mdlXMLDom_addElementUsingNamespace (&lvl1NodeRef, domRef, rootNodeRef, XMLDATATYPE_WIDESTRING, xmlns, L"ECSchemaReference", L""); mdlXMLDomElement_addAttribute (lvl1NodeRef, XMLDATATYPE_WIDESTRING, L"name", L"Bentley_Standard_CustomAttributes"); mdlXMLDomElement_addAttribute (lvl1NodeRef, XMLDATATYPE_WIDESTRING, L"version", L"1.0"); mdlXMLDomElement_addAttribute (lvl1NodeRef, XMLDATATYPE_WIDESTRING, L"prefix", L"bsca"); mdlXMLDom_save (domRef, FILESPEC_LOCAL, L"d:\\test.ecschema.xml", NULL, NULL, L"utf-8", TRUE, TRUE, TRUE); mdlXMLDomNode_free (rootNodeRef); mdlXMLDom_free (domRef); }
生成的XML文件如下:
<?xml version="1.0" encoding="utf-8"?> <ECSchema schemaName="Sample" nameSpacePrefix="SA" version="1.0" xmlns="http://www.bentley.com/schemas/Bentley.ECXML.2.0"> <ECSchemaReference name="Bentley_Standard_CustomAttributes" version="1.0" prefix="bsca"/> </ECSchema>