XmlSerializer在XML文件中具有属性和前缀

时间:2011-12-08 20:52:01

标签: c# xml xml-serialization

我可以使用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();            
        }
    }
}

2 个答案:

答案 0 :(得分:2)

答案 1 :(得分:0)

感谢来自competent_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>