【问题标题】:XmlSerializer to have attribute and prefix in XML fileXmlSerializer 在 XML 文件中具有属性和前缀
【发布时间】:2011-12-08 20:52:01
【问题描述】:

我可以使用 XmlSerializer 从 C# 类中获取这个 XML 文件。

<?xml version="1.0" encoding="utf-8"?>
<Component xmlns:spirit="b" xmlns:chrec="a" MovieName="0" BlocksNotCovered="0">
  <ClassInfoList>
    <chrec:string>hello</chrec:string>
    <chrec:string>world</chrec:string>
  </ClassInfoList>
  <moduleName />
  <world>
    <x>10</x>
    <y>20</y>
  </world>
</Component>

如何为 chrec 和 spriti 添加前缀命名空间?例如,我怎样才能得到这个 XML 文件?

<?xml version="1.0" encoding="utf-8"?>
<spirit:Component xmlns:spirit="b" xmlns:chrec="a" MovieName="0" BlocksNotCovered="0">
  <spirit:ClassInfoList>
    <chrec:string>hello</chrec:string>
    <chrec:string>world</chrec:string>
  </spirit:ClassInfoList>
  <spirit:moduleName />
  <chrec:world>
    <chrec:x>10</chrec:x>
    <chrec:y>20</chrec:y>
  </chrec:world>
</spirit:Component>

这是 C# 代码。

using System;
using System.Collections.Generic;
using System.Text;
using System.Diagnostics;
using System.IO;
using System.Xml;
using System.Xml.Linq;
using System.Xml.Serialization;
using System.Linq;

namespace Coverage
{
    public class Hello
    {
        public int x;
        public int y;
        public Hello()
        {
            x = 10;
            y = 20;
        }
    }
    public class Component {
        [XmlAttribute("MovieName")]
        public int MovieName;
        [XmlAttribute("BlocksNotCovered")]
        public int BlocksNotCovered;
        [XmlNamespaceDeclarations]
        public XmlSerializerNamespaces ns;

        public List<string> ClassInfoList;

        public string moduleName;
        public Hello world;

        public Component()
        {
            ClassInfoList = new List<string>() {"hello", "world"};
            MovieName = 0;
            BlocksNotCovered = 0;
            moduleName = "";
            world = new Hello();
        }
    }

    class Cov2xml
    {
        static void Main(string[] args)
        {
            string xmlFileName = "perf.xml";
            Component report = new Component();

            TextWriter writeFileStream = new StreamWriter(xmlFileName);

            report.ns = new XmlSerializerNamespaces();
            report.ns.Add("chrec","a");
            report.ns.Add("spirit","b");

            var ser = new XmlSerializer(typeof(Component));
            ser.Serialize(writeFileStream, report, report.ns);
            writeFileStream.Close();            
        }
    }
}

【问题讨论】:

    标签: c# xml xml-serialization


    【解决方案1】:

    感谢 Competitive_tech 提供的链接,我可以找到方法。

    如何设置前缀命名空间?

    可以使用 XmlRootAttribute,重要的是命名空间是命名空间,而不是命名空间名称。在示例中,它应该是“b”而不是“chrec”。

    [XmlRootAttribute("Component", Namespace="http://namespace", IsNullable = false)]
    public class Component {
    

    如何为特定元素设置前缀命名空间?

    您可以在变量之前使用 XmlElement。

    [XmlElement("xyz", Namespace="http://www.namespace", IsNullable = false)]
    int x;
    

    你会得到这个。

    <?xml version="1.0" encoding="utf-8"?>
    <chrec:Component xmlns:spirit="http:..." MovieName="0" BlocksNotCovered="0" xmlns:chrec="...">
      <chrec:ClassInfoList>
        <chrec:string>hello</chrec:string>
        <chrec:string>world</chrec:string>
      </chrec:ClassInfoList>
      <chrec:moduleName />
      <chrec:world>
        <spirit:xyz>10</spirit:xyz>
        <chrec:y>20</chrec:y>
      </chrec:world>
    </chrec:Component>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-15
      • 1970-01-01
      • 2011-12-20
      • 2012-05-27
      • 2016-03-25
      • 1970-01-01
      • 2013-06-30
      • 1970-01-01
      相关资源
      最近更新 更多