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

问题描述:

我正在从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的命名空间包含在根,然后还有“ABC”应该前缀只是我的根元素,即“国家”。我尝试过使用在线提到的各种选项,但其中没有一个真正为我工作。当我使用XmlSerializerNamespaces并重载我的Serialiser类时,所有的opther命名空间都消失了。所以你能让我知道我该如何实现这一点。

使用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); 
+0

是的使用XmlSerializer使我的XML结构变得简单..我能够找出使用XmlSerializer的命名空间 – Valla 2014-10-28 18:47:05

+0

我不确定我是否遵循或同意你的逻辑,即XML结构应该是决定哪种格式你用。正如您在上面看到的,对于XDocument,相同的结构也相对简单,但每种方法都有其他优缺点。无论哪种方式,很高兴你知道了。 – 2014-10-28 18:57:23

我们可以使用以下方法来包括在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); 

“国家”是,你将创建该类的对象“国家”(你的xml的根元素)。