这段代码可以解决问题!
public void WriteXml(XmlWriter writer)
{
const string ns1 = "http://firstline.com/";
const string xsi = "http://www.w3.org/2001/XMLSchema-instance";
writer.WriteStartElement("myRoot", ns1);
writer.WriteAttributeString("SchemaVersion", "1.0");
writer.WriteAttributeString("xmlns", "xsi", "http://www.w3.org/2000/xmlns/", xsi);
writer.WriteAttributeString("xsi", "schemaLocation", xsi, ns1 + " schema1.xs");
writer.WriteStartElement("element1", ns1);
writer.WriteElementString("test1", ns1, "test value");
writer.WriteElementString("test2", ns1, "value 2");
writer.WriteEndElement();
writer.WriteEndElement();//to close classname that has root xml
}
具有多个很棒的命名空间的 XML!
<?xml version="1.0" encoding="utf-16"?>
<myClassNameWhereIXmlSerializableIsImplemented>
<myRoot SchemaVersion="1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://firstline.com/ schema1.xs" xmlns="http://firstline.com/">
<element1>
<test1>test value</test1>
<test2>value 2</test2>
</element1>
</myRoot>
</myClassNameWhereIXmlSerializableIsImplemented>
这条线有些令人困惑
writer.WriteAttributeString("xmlns", "xsi", "http://www.w3.org/2000/xmlns/", xsi);
如果您提供一个随机 url 而不是"http://www.w3.org/2000/xmlns/"
,它将失败。出现在 xml 中的 url 实际上来自“xsi”变量。再举一个例子来证明这一点
writer.WriteAttributeString("xml", "base", "http://www.w3.org/XML/1998/namespace", base1);
在哪里base1 = "<custom url>"
如果你想用这样的前缀输出,<d:test1>somevalue<\d:test1>
那么writer.WriteElementString("d","test1", ns1, "somevalue");
如果上面没有定义ns1,那么它将被添加到xml输出中。
但是对于
<d:test1>
<blah>...
<\d:test1>
StartElement 需要writer.WriteStartElement("test1", ns1);
在需要时关闭writer.WriteEndElement();