如何处理根元素中的命名空间

时间:2014-10-28 17:57:37

标签: c# xml xmlserializer

我正在读取csv文件并使用c#中的XmlSerializer将数据传输到xml文件。但是现在我面临根元素中的命名空间问题。我需要的xml应该采用以下格式。

<?xml version="1.0" encoding="ASCII"?>
<abc:Country xmi:version="2.0" 
             xmlns:xmi="http://www.omg.org/XMI" 
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
             xmlns:abc="some url">
<Person></Person>
</abc:Country>

但我以这种格式获得输出:

<?xml version="1.0" encoding="ASCII"?>
<Country xmi:version="2.0" 
         xmlns:xmi="http://www.omg.org/XMI" 
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Person></Person>
</Country>

我希望abc的名称空间包含在根目录中,然后也是#34; abc&#34;应该只作为我的根元素的前缀,即&#34;国家&#34;。我尝试使用在线提到的各种选项,但它们实际上都没有为我工作。当我使用XmlSerializerNamespaces并重载我的Serialiser类时,所有opther命名空间都消失了。所以你能告诉我如何实现这一点。

2 个答案:

答案 0 :(得分:0)

使用XmlSerializer很重要吗?相反,使用XDocument很容易做到这一点。像这样:

var document = new XDocument();
XNamespace abcns = "http://some/url/abc";
XNamespace xmins = "http://www.omg.org/XMI";
XNamespace xsins = "http://www.w3.org/2001/XMLSchema-instance";


var element = new XElement(abcns + "Country",
    new XAttribute(XNamespace.Xmlns + "abc", abcns),
    new XAttribute(XNamespace.Xmlns + "xmi", xmins),
    new XAttribute(XNamespace.Xmlns + "xsi", xsins),
    new XAttribute(xmins + "version", "2.0"),
    new XElement("Person"));
document.Add(element);

答案 1 :(得分:0)

我们可以使用以下命令在xml的根元素中包含多个名称空间:

XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
            ns.Add("xmi", "http://www.omg.org/XMI");
            ns.Add("xsi", "http://www.w3.org/2001/XMLSchema-instance");
            ns.Add("abc", "some url");

XmlSerializer serializer = new XmlSerializer(typeof(Country));
TextWriter textWriter = new StreamWriter(@"C:\test.xml", true, Encoding.ASCII);
                serializer.Serialize(textWriter, country, ns);

&#34;国家&#34;将是你要为类创建的对象&#34; Country&#34;(xml的根元素)。