gpt4 book ai didi

c# - .NET 中的 XmlSerializer 与 XmlSchemaForm.Unqualified

转载 作者:太空狗 更新时间:2023-10-29 23:52:35 24 4
gpt4 key购买 nike

给定以下代码:

using System;
using System.Xml.Schema;
using System.Xml.Serialization;

namespace XmlSerializationTest
{
[XmlType(Namespace = "http://www.test.com")]
public class Element
{
[XmlElement]
public int X;
}

[XmlRoot(Namespace = "http://www.test.com")]
public class Root
{
[XmlElement(Form = XmlSchemaForm.Unqualified)]
public Element Element;
}

public static class Program
{
public static void Main(string[] args)
{
var root = new Root { Element = new Element { X = 1 } };
var xmlSerializer = new XmlSerializer(typeof(Root));
xmlSerializer.Serialize(Console.Out, root);
}
}
}

输出是:

<?xml version="1.0" encoding="ibm852"?>
<Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.test.com">
<Element xmlns="">
<X xmlns="http://www.test.com">1</X>
</Element>
</Root>

问题是为什么将 Form 属性设置为 XmlSchemaForm.Unqualified 会导致 Element 元素的命名空间被设置为 "",即使它XmlTypeAttribute 属性是否具有与 Root 元素相同的命名空间?

这种代码(XmlSchemaForm.Unqualified 部分)是由 WSCF.blue 工具生成的,它混淆了命名空间。

最佳答案

您可以覆盖元素类型中指定的命名空间。例如。你可以拥有

[XmlElement(Namespace="http://foo.com")]
public Element Element;

输出是

<Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.test.com">
<Element xmlns="http://foo.com">
<X xmlns="http://www.test.com">1</X>
</Element>
</Root>

Microsoft 的 Form = XmlSchemaForm.Unqualified 的实现似乎完全等同于将 Namespace 设置为 ""。特别是,如果您明确指定任何其他命名空间 ( MSDN reference),则不能使用它。如果你这样做,你会得到这个异常:

未处理的异常:System.InvalidOperationException:反射(reflect)类型“XmlSerializationTest.Root”时出现错误。 ---> System.InvalidOperationException:反射(reflect)字段“元素”时出错。 ---> System.InvalidOperationException:当存在显式 Namespace 属性时,Form 属性可能不是“Unqualified”。

关于c# - .NET 中的 XmlSerializer 与 XmlSchemaForm.Unqualified,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6907823/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com