c# - 如何使用 XDocument 添加 xml 前缀?
问题描述
如何使用 XDocument 将 xml 前缀添加到现有根元素?我有以下 XML:
<processSalesOrder>
<header/>
</processSalesOrder>
我希望它看起来像:
<ns0:processSalesOrder xmlns:ns0='https://xyx/'>
<header/>
</ns0:processSalesOrder>
在我的场景中,我从 web api 接收这个 xml 并将其长时间传递给另一个 web 服务。Web 服务需要根元素上的命名空间前缀。
Web 服务来自第三方软件,它需要某种格式的 xml。我尝试了 XmlDocument、XDocument 等...我找不到仅在根元素上添加命名空间前缀的方法。如果前缀在后代上,Webservice 将拒绝交易。
解决方案
从这里获得参考开发人员名称:Vijay Sirigiri
如果您在加载 xml 文档后尝试向元素添加命名空间,那么这是不可能的。
来自 MSDN:
在将文档加载到 XML 文档对象模型 (XMLDOM) 解析器后,您不能在 XML 文档的实例中添加、修改或删除 XML 命名空间定义。用于表示 XML 文档中数据的 XML 节点是在将文档加载到 XMLDOM 解析器时创建的。这些节点在创建时永久绑定到它们的 XML 命名空间属性。因此,将空的 XML 命名空间声明 (xmlns = "") 附加到这些节点的子节点,以保留这些节点的默认 XML 命名空间属性。
但是,您可以加载输入,读取每个元素并将其写入具有命名空间集的另一个文档(或内存中)。下面是解析字符串 xml、创建一个新的 xml 元素以及命名空间前缀和命名空间的代码。
String xmlWithoutNamespace =
@"<Folio><Node1>Value1</Node1><Node2>Value2</Node2><Node3>Value3</Node3></Folio>";
String prefix ="vs";
String testNamespace = "http://www.testnamespace/vs/";
XmlDocument xmlDocument = new XmlDocument();
XElement folio = XElement.Parse(xmlWithoutNamespace);
XmlElement folioNode = xmlDocument.CreateElement(prefix, folio.Name.LocalName, testNamespace);
var nodes = from node in folio.Elements()
select node;
foreach (XElement item in nodes)
{
var node = xmlDocument.CreateElement(prefix, item.Name.ToString(), testNamespace);
node.InnerText = item.Value;
folioNode.AppendChild(node);
}
xmlDocument.AppendChild(folioNode);
xmlDocument 现在包含每个节点以 vs 为前缀的 xml。
推荐阅读
- swift - 如何在 Swift 中取消本地通知触发器
- javascript - aasy函数结束后返回函数的值
- scripting - 当你被杀时,你如何在 roblox studio 中制作它,它说“你杀了这个玩家”或其他什么?
- function - 引用 Lua 中当前未识别的函数
- c++ - 我们如何编写一个 C++ 程序来使用类来控制银行账户?
- html - AngularJS $routeProvider:路由不起作用
- python-3.x - 如何从python3中的每一行读取起始N个单词
- c++ - 我可以使用模板作为多态处理数组的安全解决方案吗?
- java - 阻塞队列是否需要同步块
- haskell - 如何将列表元素分隔为 Char 或 Float