[V8i C++]如何利用mdlXML函数创建ECSchema.XML文件?

老师好,我想确定一下,是不是用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>

    想必你看完这个后面的内容可以“照猫画虎”了吧?Smile



  • 符工,我也是这样建的代码也是这样的,部分如下:

    //创建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差别就在于 这部分,但是这部分我不知道该怎么用代码创建?