如何处理根元素中的命名空间
问题描述:
我正在从csv文件中读取数据,并使用C#中的XmlSerializer将数据传输到xml文件。但现在我面临着根元素中命名空间的问题。我需要xml采用以下格式。如何处理根元素中的命名空间
<?xml version="1.0" encoding="ASCII"?>
<abc:Country xmi:version="2.0"
xmlns:xmi="http://www.omg.org/XMI"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:abc="some url">
<Person></Person>
</abc:Country>
但我得到我的输出格式为:
<?xml version="1.0" encoding="ASCII"?>
<Country xmi:version="2.0"
xmlns:xmi="http://www.omg.org/XMI"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Person></Person>
</Country>
我想ABC的命名空间包含在根,然后还有“ABC”应该前缀只是我的根元素,即“国家”。我尝试过使用在线提到的各种选项,但其中没有一个真正为我工作。当我使用XmlSerializerNamespaces并重载我的Serialiser类时,所有的opther命名空间都消失了。所以你能让我知道我该如何实现这一点。
答
使用XmlSerializer很重要吗?这种事情对于XDocument来说很容易。事情是这样的:
var document = new XDocument();
XNamespace abcns = "http://some/url/abc";
XNamespace xmins = "http://www.omg.org/XMI";
XNamespace xsins = "http://www.w3.org/2001/XMLSchema-instance";
var element = new XElement(abcns + "Country",
new XAttribute(XNamespace.Xmlns + "abc", abcns),
new XAttribute(XNamespace.Xmlns + "xmi", xmins),
new XAttribute(XNamespace.Xmlns + "xsi", xsins),
new XAttribute(xmins + "version", "2.0"),
new XElement("Person"));
document.Add(element);
答
我们可以使用以下方法来包括在XML的根元素多个命名空间:
XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
ns.Add("xmi", "http://www.omg.org/XMI");
ns.Add("xsi", "http://www.w3.org/2001/XMLSchema-instance");
ns.Add("abc", "some url");
XmlSerializer serializer = new XmlSerializer(typeof(Country));
TextWriter textWriter = new StreamWriter(@"C:\test.xml", true, Encoding.ASCII);
serializer.Serialize(textWriter, country, ns);
“国家”是,你将创建该类的对象“国家”(你的xml的根元素)。
是的使用XmlSerializer使我的XML结构变得简单..我能够找出使用XmlSerializer的命名空间 – Valla 2014-10-28 18:47:05
我不确定我是否遵循或同意你的逻辑,即XML结构应该是决定哪种格式你用。正如您在上面看到的,对于XDocument,相同的结构也相对简单,但每种方法都有其他优缺点。无论哪种方式,很高兴你知道了。 – 2014-10-28 18:57:23