如何使用XML/XElement实现带冒号前缀的<HART:HART>标签
解决XML根元素前缀不显示的问题
我明白你的困扰——你想要生成带HART:前缀的根元素<HART:HART>,但当前代码输出的却是不带前缀的<HART>,这是因为你对XML命名空间前缀的处理逻辑有点偏差,咱们来一步步修正:
问题根源
你当前的代码把目标命名空间设为了默认命名空间(没有前缀),所以生成的元素会使用xmlns="..."的形式,而不是显式的前缀绑定。要得到<HART:HART>,需要先把HART这个前缀和目标命名空间绑定,再用这个前缀来命名根元素。
修改后的代码
public FileStreamResult Submission(Models.Reporting.SubmissionViewModel svm) { MemoryStream ms = new MemoryStream(); XmlWriterSettings xws = new XmlWriterSettings(); xws.OmitXmlDeclaration = true; xws.Indent = true; // 定义两个核心命名空间:HART前缀对应的命名空间,以及xsi标准命名空间 XNamespace hartNs = "www.myurlhere.com"; XNamespace xsiNs = "http://www.w3.org/2001/XMLSchema-instance"; using (XmlWriter xw = XmlWriter.Create(ms, xws)) { XDocument doc = new XDocument( // 根元素:关联HART命名空间,这样会自动使用我们声明的前缀 new XElement(hartNs + "HART", // 关键:声明HART前缀和命名空间的映射,这会生成xmlns:HART="..." new XAttribute(XNamespace.Xmlns + "HART", hartNs), // 声明xsi命名空间 new XAttribute(XNamespace.Xmlns + "xsi", xsiNs), // 设置schemaLocation,按你期望的格式赋值 new XAttribute(xsiNs + "schemaLocation", "www.myurlhere") ) ); doc.WriteTo(xw); } ms.Position = 0; return File(ms, "text/xml", "Sample.xml"); }
关键修改点说明
- 显式声明前缀映射:新增的
new XAttribute(XNamespace.Xmlns + "HART", hartNs)这行代码,就是告诉XML解析器:HART这个前缀对应www.myurlhere.com这个命名空间,这样根元素就会显示为HART:HART。 - 统一命名空间URL:我把你代码里的
http://www.myurlhere.com改成了www.myurlhere.com,和你期望的xmlns:HART="www.myurlhere.com"保持一致。 - 根元素关联命名空间:
hartNs + "HART"确保根元素属于HART命名空间,结合前缀映射,就会生成带前缀的标签。
生成的XML结果
修改后输出的XML会完全符合你的预期:
<HART:HART xmlns:HART="www.myurlhere.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="www.myurlhere" />
内容的提问来源于stack exchange,提问作者S.Gray
相关产品推荐
相关产品推荐

