【问题标题】:how to handle namespaces in the root element如何处理根元素中的命名空间
【发布时间】:2014-10-29 02:50:39
【问题描述】:

我正在读取 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 命名空间都消失了。所以你能告诉我如何实现这一点吗?

【问题讨论】:

    标签: c# xml xmlserializer


    【解决方案1】:

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

    【讨论】:

    • 是的,使用 XmlSerializer 使我的 xml 结构变得容易。我能够通过 XmlSerializer 弄清楚使用命名空间
    • 我不确定我是否遵循或同意您的逻辑,即 XML 结构应该是您使用哪种格式的决定因素。正如您在上面看到的,XDocument 的相同结构也相对简单,但每种方法都有其他优点和缺点。不管怎样,很高兴你想通了。
    【解决方案2】:

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

    “country”将是您将为“Country”类(xml 的根元素)创建的对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-04-23
      • 2019-10-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-28
      • 2011-09-05
      • 2021-08-02
      相关资源
      最近更新 更多