如何使用XmlSerializer将自定义值设置为xml标头中的xmlns

时间:2015-10-29 11:58:57

标签: c# xml

我尝试使用XmlSerializer将Document标记内的xmlns属性值设置为自定义值。 目前,我简化的xml看起来像这样:

<?xml version="1.0" encoding="utf-8"?>
<Document xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:iso:std:iso:20022:tech:xsd:pain.001.001.03 pain.001.001.03.xsd">
  <GrpHdr>
    <Price Curency="EUR">
      40.55
    </Price>
  </GrpHdr>
</Document>

我的简化代码如下所示:

public void Main(){
    var document = new CustomDocument();
    new XmlSerializer(typeof(CustomDocument)).Serialize(Console.Out, document);
}

[XmlRoot(ElementName = "Document")]
public class CustomDocument{

    [XmlAttribute("schemaLocation", AttributeName = "schemaLocation",
        Namespace = "http://www.w3.org/2001/XMLSchema-instance")]
    public string SchemaLocation = "urn:iso:std:iso:20022:tech:xsd:pain.001.001.03 pain.001.001.03.xsd";

    [XmlElement("GrpHdr")
    Public XmlHeader {get; set;}

    Public XmlDocument(){
        XmlHeader = new XmlHeader();
    }
}

public class XmlHeader{
    [XmlElement("Price")
    Public string Price {get; set;}

    public XmlHeader(){
        Price = "40.55";
    }
}

如何更改xmlns:xsd的值?添加[XmlElement(&#34; xmlns&#34;)]并不能解决问题

2 个答案:

答案 0 :(得分:2)

不幸的是,你不允许这样做。 $(document).ajaxStart(function() { }); var handlers = jQuery._data( document,"test","ajaxStart" ); console.log(handlers); xmlns:xsi是保留的命名空间。您无法更改默认值,因为它是.Net框架中提供的标准架构定义的一部分。

我不确定你为什么要这样做但是如果你想添加你的架构xsd的命名空间匹配命名空间,那么你可以添加一个自定义命名空间,如:

xmlns:xsd

这将出现在你的xml中:

 [XmlRoot(ElementName = "Document", Namespace = "http://customNameSpaceFromXsd/XMLSchema.xsd")]
    public class CustomDocument{
    }

答案 1 :(得分:1)

使用XML Linq

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

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            //<?xml version="1.0" encoding="utf-8"?>
            //<Document xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:iso:std:iso:20022:tech:xsd:pain.001.001.03 pain.001.001.03.xsd">
            //  <GrpHdr>
            //    <Price Curency="EUR">
            //      40.55
            //    </Price>
            //  </GrpHdr>
            //</Document>

            string xml =
               "<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
               "<Document xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"urn:iso:std:iso:20022:tech:xsd:pain.001.001.03 pain.001.001.03.xsd\">" +
               "</Document>";

            XDocument doc = XDocument.Parse(xml);
            XElement document = (XElement)doc.FirstNode;
            XNamespace xsd = document.GetNamespaceOfPrefix("xsd");
            XNamespace xsi = document.GetNamespaceOfPrefix("xsi");

            document.Add(new XElement("GrpHddr",
                    new XElement("Price", new object[] {
                        new XAttribute("Currency", "EUR"),
                        40.55
                    })
            ));

        }
    }
}
​