jjzjj

c# - 在 XML 序列化期间忽略属性 XmlNamespaceDeclarations

coder 2024-06-29 原文

我尝试用自定义命名空间序列化一个对象。这是类的样子:

[XmlRoot("Root", Namespace = "myNamespace")]
public partial class MyClass
{
    public MyClass()
    {
        this.Xmlns = new XmlSerializerNamespaces();
        this.Xmlns.Add(string.Empty, "myNamespace");
    }

    [XmlNamespaceDeclarations()]
    public XmlSerializerNamespaces Xmlns = null;
}

下面是序列化它的代码:

XmlSerializer serializer = new XmlSerializer(typeof(MyClass));
serializer.Serialize(xmlWriter, obj);

预期的结果是

<Root xmlns="myNamespace" />

但是它仍然具有 xmlns:xsi 和 xmlns:xsd 属性:

<Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="myNamespace" />

当我使用 serializer.Serialize(xmlWriter, obj, obj.Xmlns) 进行序列化时,结果是正确的。

为什么序列化程序会忽略 XmlNamespaceDeclarations 属性?它不应该自动从中获取 namespace 声明吗?如何在序列化类中定义命名空间?

提前致谢!

最佳答案

Why does serializer ignore that XmlNamespaceDeclarations attribute? Shouldn't it automatically take the namespace declarations from it?

实际上,Serializer 所做的是忽略您的XmlNamespaceDeclarations,而是添加 它们进入默认的内部 XmlWriter 命名空间

默认情况下,已经有一些 prefixes-namespaces 对(或者我会简单地调用 namespaces 来简化这个答案的其余部分)嵌入到 XmlWriter。它们就是您所看到的:

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" //note the lovely pairs here
xmlns:xsd="http://www.w3.org/2001/XMLSchema" 

因此,如果您使用 XmlWriter,您必须忍受它的 默认 namespace ,不幸的是,这些 namespace 不会暴露给外部用户。而且,为了让事情变得“更糟”(实际上,并没有那么糟,但我试着把它放在上下文中),它以某种方式不允许你用它做任何事情。

唯一与 namespace 有关的 XmlWriter 属性是 NamespaceHandling ,它只能设置为删除 duplicate namespaces 或保留它们。这意味着,只有当您以某种方式(相当神奇地)为您的可序列化类声明了重复 namespace 时,该属性才有用:

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema" 

尽管如此,XmlWriter 仍然有一些“好”的东西,您可以通过设置省略 XmlDeclaration:

OmitXmlDeclaration = true;

当您创建 XmlWriterSettings 并使用设置初始化您的 XmlWriter

简而言之,我们不能希望 XmlWriter 通过删除它的默认 namespace 来为我们做好事 - 它根本做不到。

因此,我们必须通过Serializer来获取解决方案


How can I define namespaces inside serialized class?

信不信由你,这与您已经做过的完全一样!

overloading方法 Serialize(XmlWriter, Object, XmlSerializerNamespaces)专为该目的而设计。当你调用它时:

serializer.Serialize(xmlWriter, obj, obj.Xmlns);

替换默认命名空间+您的命名空间您的命名空间

如果你使用Serialize(XmlWriter,‍Object)重载,Serializer所做的就是获取中的所有namespaces XmlWriter 以及Object 然后写入XML 文件。因此,您在那里获得了所有 namespace :默认值和您的

这可能是因为 XmlWriter 也(在内部)应用了 XmlNamespaceScope成为 XmlNamespaceScope.All,您 - 再次 - 对此无能为力。

但是当您使用 Serialize(XmlWriter, Object, XmlSerializerNamespaces) 时,您实际上告诉 Serializer 仅使用您指定的 XmlSerializerNamespaces。因此,它做了正确的事情!

换句话说,您所做的已经是在 Xml 文件中获取所需 namespace 的“官方”方式。

除此之外,您还可以根据需要将多个 namespaces 放入您的 XML 文件中,只需根据需要多次使用 Xmlns.Add(prefix, ns)想要。

因此,您已经为您的目的做了正确的事情。我只是想解释为什么会这样。

关于c# - 在 XML 序列化期间忽略属性 XmlNamespaceDeclarations,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35417590/

有关c# - 在 XML 序列化期间忽略属性 XmlNamespaceDeclarations的更多相关文章

  1. ruby-on-rails - 如何从 format.xml 中删除 <hash></hash> - 2

    我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为

  2. ruby-on-rails - 如果为空或不验证数值,则使属性默认为 0 - 2

    我希望我的UserPrice模型的属性在它们为空或不验证数值时默认为0。这些属性是tax_rate、shipping_cost和price。classCreateUserPrices8,:scale=>2t.decimal:tax_rate,:precision=>8,:scale=>2t.decimal:shipping_cost,:precision=>8,:scale=>2endendend起初,我将所有3列的:default=>0放在表格中,但我不想要这样,因为它已经填充了字段,我想使用占位符。这是我的UserPrice模型:classUserPrice回答before_val

  3. ruby-on-rails - 在混合/模块中覆盖模型的属性访问器 - 2

    我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah

  4. ruby - 多个属性的 update_column 方法 - 2

    我有一个具有一些属性的模型:attr1、attr2和attr3。我需要在不执行回调和验证的情况下更新此属性。我找到了update_column方法,但我想同时更新三个属性。我需要这样的东西:update_columns({attr1:val1,attr2:val2,attr3:val3})代替update_column(attr1,val1)update_column(attr2,val2)update_column(attr3,val3) 最佳答案 您可以使用update_columns(attr1:val1,attr2:val2

  5. ruby - Nokogiri 剥离所有属性 - 2

    我有这个html标记:我想得到这个:我如何使用Nokogiri做到这一点? 最佳答案 require'nokogiri'doc=Nokogiri::HTML('')您可以通过xpath删除所有属性:doc.xpath('//@*').remove或者,如果您需要做一些更复杂的事情,有时使用以下方法遍历所有元素会更容易:doc.traversedo|node|node.keys.eachdo|attribute|node.deleteattributeendend 关于ruby-Nokog

  6. ruby-on-rails - 在 Rails 和 ActiveRecord 中查询时忽略某些字段 - 2

    我知道我可以指定某些字段来使用pluck查询数据库。ids=Item.where('due_at但是我想知道,是否有一种方法可以指定我想避免从数据库查询的某些字段。某种反拔?posts=Post.where(published:true).do_not_lookup(:enormous_field) 最佳答案 Model#attribute_names应该返回列/属性数组。您可以排除其中一些并传递给pluck或select方法。像这样:posts=Post.where(published:true).select(Post.attr

  7. ruby-on-rails - Rails 模型——非持久类成员或属性? - 2

    对于Rails模型,是否可以/建议让一个类的成员不持久保存到数据库中?我想将用户最后选择的类型存储在session变量中。由于我无法从我的模型中设置session变量,我想将值存储在一个“虚拟”类成员中,该成员只是将值传递回Controller。你能有这样的类(class)成员吗? 最佳答案 将非持久属性添加到Rails模型就像任何其他Ruby类一样:classUser扩展解释:在Ruby中,所有实例变量都是私有(private)的,不需要在赋值前定义。attr_accessor创建一个setter和getter方法:classUs

  8. c# - 如何在 ruby​​ 中调用 C# dll? - 2

    如何在ruby​​中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL

  9. C# 到 Ruby sha1 base64 编码 - 2

    我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha

  10. ruby - 是否有用于序列化和反序列化各种格式的对象层次结构的模式? - 2

    给定一个复杂的对象层次结构,幸运的是它不包含循环引用,我如何实现支持各种格式的序列化?我不是来讨论实际实现的。相反,我正在寻找可能会派上用场的设计模式提示。更准确地说:我正在使用Ruby,我想解析XML和JSON数据以构建复杂的对象层次结构。此外,应该可以将该层次结构序列化为JSON、XML和可能的HTML。我可以为此使用Builder模式吗?在任何提到的情况下,我都有某种结构化数据-无论是在内存中还是文本中-我想用它来构建其他东西。我认为将序列化逻辑与实际业务逻辑分开会很好,这样我以后就可以轻松支持多种XML格式。 最佳答案 我最

随机推荐