5

I could get this XML file from C# class with XmlSerializer.

<?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>

How can I add prefix namespaces for chrec and spriti? For example, how can I get this XML file?

<?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>

This is the C# code.

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();            
        }
    }
}
prosseek
  • 182,215
  • 215
  • 566
  • 871

1 Answers1

0

Thanks to the link from competent_tech, I could figure out the way to do it.

How to set the prefix namespace?

You can use XmlRootAttribute, the important thing is that the names space is the namespace, not the namespace name. In the example, it should be "b" not "chrec".

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

How to set the prefix namespace for a specific element?

You can use XmlElement just before the variable.

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

And you'll get this.

<?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>
prosseek
  • 182,215
  • 215
  • 566
  • 871