求助:mxgraph getPrettyXml()无法获取自定义元素值如何解决?
解决mxGraph getPrettyXml()无法获取自定义content元素值的问题
我之前也踩过mxGraph自定义元素序列化的坑,给你几个实用的解决方向:
1. 扩展mxXmlCodec序列化逻辑(推荐方案)
mxGraph默认的XML序列化只会处理它内置的元素和属性,自定义的子节点比如你的<content>不会被自动包含。你需要手动注册自定义的编解码器,告诉mxGraph要序列化这些子元素:
// 针对你的Symbol自定义元素注册编解码器,开启子元素序列化 const symbolCodec = new mxObjectCodec(new Symbol()); symbolCodec.encodeChildren = true; // 关键:确保子元素被纳入序列化流程 mxCodecRegistry.register(symbolCodec); // 或者直接扩展mxCell的编解码器,手动添加自定义子节点的序列化逻辑 mxCellCodec.prototype.encode = function(enc, obj, node) { // 先执行默认的序列化逻辑 node = mxObjectCodec.prototype.encode.apply(this, arguments); // 从cell对象中取出之前绑定的content值,生成对应的XML节点 if (obj.detail?.content) { const detailNode = enc.document.createElement('detail'); const contentNode = enc.document.createElement('content'); contentNode.textContent = obj.detail.content; detailNode.appendChild(contentNode); node.appendChild(detailNode); } return node; };
2. 确保自定义数据已绑定到mxCell对象
你模板里的<content>值需要在加载模板时被正确解析并绑定到对应的mxCell实例上,否则序列化时没有数据源可取。可以在解析XML后遍历cell,把自定义数据存到cell的属性或自定义字段中:
const xmlDoc = mxUtils.parseXml(yourTemplateXml); const codec = new mxXmlCodec(xmlDoc); const graphModel = codec.decode(xmlDoc.documentElement); // 遍历所有cell,提取并绑定content值 graphModel.getChildCells().forEach(cell => { // 假设解析后的cell.value包含Symbol的自定义数据 if (cell.value?.detail?.content) { // 可以存到cell的自定义属性 cell.setAttribute('content', cell.value.detail.content); // 或者直接挂载到cell的自定义字段 cell.detailContent = cell.value.detail.content; } });
3. 临时方案:手动修改XML输出
如果赶时间,也可以在getPrettyXml()生成XML后,手动插入缺失的<content>节点(这种方法比较hack,不推荐长期使用):
let rawXml = graph.getPrettyXml(); const xmlDoc = mxUtils.parseXml(rawXml); // 找到所有Symbol节点,插入content子元素 const symbolNodes = xmlDoc.getElementsByTagName('Symbol'); for (let i = 0; i < symbolNodes.length; i++) { const symbolNode = symbolNodes[i]; // 这里要从对应的cell中获取实际的content值,示例为"test" const contentValue = graph.getModel().getCell(symbolNode.getAttribute('id'))?.detailContent || 'test'; const detailNode = xmlDoc.createElement('detail'); const contentNode = xmlDoc.createElement('content'); contentNode.textContent = contentValue; detailNode.appendChild(contentNode); symbolNode.appendChild(detailNode); } // 得到最终包含content的XML const finalXml = mxUtils.getXml(xmlDoc.documentElement);
核心思路是让mxGraph的序列化流程识别并处理你的自定义元素,同时保证数据在解析阶段就正确绑定到cell对象上,这样getPrettyXml()就能正确输出<content>的值了。
内容的提问来源于stack exchange,提问作者NZLearner
相关产品推荐
相关产品推荐

