Genexus中带命名空间的XML填充SDT失败问题求助
解决GeneXus SDT FromXML方法处理带命名空间XML的空值问题
可行解决方案
1. 正确配置SDT的命名空间映射
确保根SDT及其所有嵌套子SDT、属性的「命名空间」属性,都填入XML对应的命名空间URL(例如http://ivaservizi.agenzia...1.2)。如果XML中存在多命名空间,需要为对应节点的SDT分别配置匹配的命名空间。
2. 使用FromXml重载版本指定命名空间管理器
利用GeneXus提供的FromXml重载方法,传入XmlNamespaceManager来处理前缀与命名空间的映射,即使前缀变化也能适配:
&text = &file.ReadAllText() &xmlDoc = new XmlDocument() &xmlDoc.LoadXml(&text) &nsManager = new XmlNamespaceManager(&xmlDoc.NameTable) // 动态提取XML中的所有命名空间前缀与URL(适配任意前缀) For each &attr in &xmlDoc.DocumentElement.Attributes if &attr.Name.StartsWith("xmlns:") &prefix = &attr.Name.Substring(6) // 截取前缀部分 &nsManager.AddNamespace(&prefix, &attr.Value) endif EndFor &isOk = &Fattura.FromXml(&xmlDoc.DocumentElement, &nsManager)
3. 代码动态移除XML命名空间(无需手动修改)
如果不需要保留命名空间信息,可以通过递归处理XML节点,移除所有命名空间前缀后再填充SDT:
&text = &file.ReadAllText() &xmlDoc = new XmlDocument() &xmlDoc.LoadXml(&text) // 递归移除所有节点的命名空间 RemoveNamespaces(&xmlDoc.DocumentElement) &isOk = &Fattura.FromXml(&xmlDoc.OuterXml) // 定义递归处理过程 Procedure RemoveNamespaces(&node as XmlNode) &newNode = &xmlDoc.CreateNode(&node.NodeType, &node.LocalName, "") // 复制非命名空间属性 For each &attr in &node.Attributes if not &attr.Name.StartsWith("xmlns") &newAttr = &xmlDoc.CreateAttribute(&attr.LocalName) &newAttr.Value = &attr.Value &newNode.Attributes.Append(&newAttr) endif EndFor // 递归处理子节点 For each &child in &node.ChildNodes if &child.NodeType = XmlNodeType.Element RemoveNamespaces(&child) &newNode.AppendChild(&child) else &newNode.AppendChild(&xmlDoc.ImportNode(&child, True)) endif EndFor // 替换原节点 &node.ParentNode.ReplaceChild(&newNode, &node) EndProcedure
注意事项
- 使用命名空间管理器时,动态提取前缀的方式可以适配任意变化的前缀,无需硬编码。
- 移除命名空间的方法适用于所有节点属于同一命名空间、且无需保留命名空间信息的场景,兼容性更强。
内容的提问来源于stack exchange,提问作者Nicola
相关产品推荐
相关产品推荐

