C#将默认名称空间转换为带前缀的名称空间

时间:2020-01-02 15:09:17

标签: c# .net xml

我需要能够转换一个包含许多不同默认名称空间的xml文档。进入使用前缀名称空间的文档。

示例xml:

<?xml version="1.0" encoding="utf-8"?>
<agent xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <name id="0" xmlns="http://test.com">
        name1
    </name>
    <interests xmlns="http://test.com">
        <interest xmlns="">
            interest1
        </interest>
        <interest xmlns="">
            interest2
        </interest>
        <interest xmlns="">
            interest3
        </interest>
        <interest xmlns="">
            interest4
        </interest>
        <interest xmlns="">
            interest5
        </interest>
        <ddfsdf xmlns="http://test2.com">
            ddfsdf1
        </ddfsdf>
    </interests>
    <foo xmlns="http://test2.com">
        foo1
    </foo>
</agent>

所需的xml:

<?xml version="1.0" encoding="utf-8"?>
<agent xmlns:test="http://test.com" xmlns:test2="http://test2.com">
    <test:name id="1">Fox Mulder</test:name>
    <test:interests>
        <interest>paranormal</interest>
        <interest>aliens</interest>
        <test2:ddfsdf>dfsdf</test2:ddfsdf>
    </test:interests>
    <test2:foo>foo</test2:foo>
</agent>

是否可以在C#中做到这一点?

1 个答案:

答案 0 :(得分:0)

尝试以下操作:

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



namespace ConsoleApplication143
{
    class Program
    {
        const string INPUT_FILENAME = @"c:\temp\test.xml";
        const string OUTPUT_FILENAME = @"c:\temp\test1.xml";

        static void Main(string[] args)
        {
            XmlReader reader = XmlReader.Create(INPUT_FILENAME);
            XmlSerializer serializer = new XmlSerializer(typeof(Agent));
            Agent agent = (Agent)serializer.Deserialize(reader);

            XmlWriterSettings settings = new XmlWriterSettings();
            settings.Indent = true;
            XmlWriter writer = XmlWriter.Create(OUTPUT_FILENAME, settings);

            XmlSerializerNamespaces namespaces = new XmlSerializerNamespaces();
            namespaces.Add("test","http://test.com");
            namespaces.Add("test2","http://test2.com");
            serializer.Serialize(writer, agent, namespaces);


        }
    }
    [XmlRoot(ElementName = "agent")]
    public class Agent
    {
        [XmlElement(ElementName = "name", Namespace = "http://test.com")]
        public Name name { get; set; }

        [XmlElement(ElementName = "interests", Namespace = "http://test.com")]
        public Interests interests { get; set; }

        [XmlElement(ElementName = "foo", Namespace = "http://test2.com")]
        public Foo foo { get; set; }
    }
    public class Name
    {
        [XmlAttribute("id")]
        public int id { get; set; }
    }
    public class Interests
    {
        [XmlElement(ElementName = "ddfsdf", Namespace = "http://test2.com")]
        public DDFSDF ddfsdf { get; set; }

        [XmlElement(ElementName = "interest", Namespace = "")]
        public List<Interest> interest { get; set; }
    }
    public class Interest
    {
        [XmlText]
        public string text { get; set; }
    }
    public class DDFSDF
    {
        [XmlText]
        public string text { get; set; }
    }

    public class Foo
    {
        [XmlText]
        public string text { get; set; }
    }  
}