【问题标题】:XmlElement.SetAttribute removes "xsi:" prefix. How can I keep it? [duplicate]XmlElement.SetAttribute 删除“xsi:”前缀。我怎样才能保留它? [复制]
【发布时间】:2022-01-06 04:06:55
【问题描述】:

在 C# (.NET 5) 中将属性 xsi:nil="true" 添加到 XML 元素时,它会丢失前缀。为什么会发生这种情况,更重要的是,我怎样才能确保添加了前缀?为了让 XML 传递 XSD,我需要它。

示例。考虑以下代码:

var document = new XmlDocument();
document.CreateXmlDeclaration("1.0", "utf-8", null);

var foo = document.CreateElement("foo");
document.AppendChild(foo);
foo.SetAttribute("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance");

var bar = document.CreateElement("bar");
bar.SetAttribute("xsi:nil", "true");
foo.AppendChild(bar);

using var stream = new MemoryStream();
using var xmlWriter = XmlWriter.Create(stream, new XmlWriterSettings() { OmitXmlDeclaration = false, Indent = true });
document.Save(xmlWriter);
string result = Encoding.UTF8.GetString(stream.ToArray());
System.Diagnostics.Debug.WriteLine(result);

这会导致:

<?xml version="1.0" encoding="utf-8"?>
<foo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <bar nil="true" />
</foo>

【问题讨论】:

  • 这能回答你的问题吗? How to create XmlElement attributes with prefix?
  • 意识到没有前缀被特别祝福或赋予含义而不通过命名空间声明被引入文档。 xsi: 本身并没有任何意义。
  • @Damien_The_Unbeliever,感谢您提到这一点。我不知道这是否重要,但我更改了示例以包含 xsi: 的命名空间。
  • 按照我给你的链接:dotnetfiddle.net/ZOZ9Ts
  • 你是对的。谢谢@canton7!我的问题有点重复。

标签: c# xml .net-core


【解决方案1】:

xsi前缀定义的相同命名空间需要包含在属性中:

var bar = document.CreateElement("bar");
var attribute = document.CreateAttribute("xsi", "nil", "http://www.w3.org/2001/XMLSchema-instance");
attribute.InnerText = "true";
bar.SetAttributeNode(attribute);
foo.AppendChild(bar);

【讨论】:

    猜你喜欢
    • 2014-07-24
    • 1970-01-01
    • 2012-01-16
    • 2014-12-05
    • 2023-01-23
    • 1970-01-01
    • 2018-10-19
    • 2017-06-08
    • 1970-01-01
    相关资源
    最近更新 更多