c# - 将 XMLDocument 转换为 XDocument ,获取名称空间 从 xsi 修改为 p1
问题描述
我创建一个 XMLDocument:
`
XmlDocument doc = new XmlDocument();
XmlDeclaration declaire = doc.CreateXmlDeclaration("1.0", "utf-8", null);
// -----------------------create root-----------------------------
XmlElement rootnode = doc.CreateElement( "BMECAT");
doc.InsertBefore(declaire, doc.DocumentElement);
doc.AppendChild(rootnode);
//Console.WriteLine(sb.ToString());
//get attribute for BmeCat
rootnode.SetAttribute("version", "2005");
XmlAttribute atr = doc.CreateAttribute("xsi", "schemaLocation", "http://www.w3.org/2001/XMLSchema-instance");
atr.Value = "http://www.adlnet.org/xsd/adlcp_v1p3";
rootnode.SetAttributeNode(atr);
rootnode.Attributes.Append(atr);`
然后我使用下面的函数将它转换为 XDocument 但我得到了一个像这样更改的命名空间
XDocument ToXDocument(XmlDocument xmlDocument)
{
using (var nodeReader = new XmlNodeReader(xmlDocument))
{
nodeReader.MoveToContent();
return XDocument.Load(nodeReader);
}
}
`
在 xml 和 XDocument 下方
<?xml version="1.0" encoding="utf-8"?>
<BMECAT version="2005" p1:schemaLocation="http://www.adlnet.org/xsd/adlcp_v1p3" xmlns:p1="http://www.w3.org/2001/XMLSchema-instance">
<?xml version="1.0" encoding="utf-8"?>
<BMECAT version="2005" xsi:schemaLocation="http://www.adlnet.org/xsd/adlcp_v1p3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
解决方案
您需要在元素的开头手动显式添加 xsi 命名空间声明。
节点按文档顺序处理,命名空间声明在首次使用后出现。它不知道使用xsi
前缀,直到为时已晚。
var doc = new XmlDocument();
doc.AppendChild(doc.CreateXmlDeclaration("1.0", "utf-8", null));
var root = (XmlElement)doc.AppendChild(doc.CreateElement("BMECAT"));
var xsi = "http://www.w3.org/2001/XMLSchema-instance";
root.SetAttribute("xmlns:xsi", xsi); //set the namespace now
root.SetAttribute("schemaLocation", xsi, "http://www.adlnet.org/xsd/adlcp_v1p3");
root.SetAttribute("version", "2005");
推荐阅读
- java - 通过 Wi-Fi 使用 TCP 将 Android 应用程序连接到 IoT 设备
- android - 如何将字符串的特定字符设置为文本视图而不是整个字符串?
- python - Python无法访问简单成绩程序中的全局变量
- python - Python def in if True 不返回
- php - 如何使用 PHP 从多维数组中提取值
- python - Djikstra 算法的时间复杂度最坏情况和最佳情况?
- angular - 包“angular-gauge-chart”对“@angular/core”有不兼容的对等依赖(需要“^8.0.0”(扩展),将安装“10.2.4”)
- sql - SQL - 根据日期差异选择行
- spring-boot - 我可以在运行时停止 Flux.range 吗?
- javascript - 如何将 node.js 变量传递/访问到 html 文件/模板