简体   繁体   English

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

[英]XmlSerializer to have attribute and prefix in XML file

I could get this XML file from C# class with XmlSerializer.我可以使用 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>

How can I add prefix namespaces for chrec and spriti?如何为 chrec 和 spriti 添加前缀命名空间? For example, how can I get this XML file?例如,我怎样才能得到这个 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>

This is the C# code.这是 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();            
        }
    }
}

Thanks to the link from competent_tech, I could figure out the way to do it.感谢来自competent_tech的链接,我可以找到方法。

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.您可以使用 XmlRootAttribute,重要的是名称空间是名称空间,而不是名称空间名称。 In the example, it should be "b" not "chrec".在示例中,它应该是“b”而不是“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。

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM