如何序列化为 XML 来控制命名空间?
我需要生成以下 XML:
<Learner xmlns="some.domain.api">
<ActivationDate>1999-05-31T11:20:00</ActivationDate>
<EmailAddress>String content</EmailAddress>
<ExpirationDate>1999-05-31T11:20:00</ExpirationDate>
<FederalId>String content</FederalId>
<FirstName>String content</FirstName>
<Grade>K</Grade>
<LastName>String content</LastName>
<MiddleName>String content</MiddleName>
<UserName>String content</UserName>
<Password>String content</Password>
<SISId>String content</SISId>
<StateId>String content</StateId>
<Status>Active</Status>
</Learner>
我已阅读这些问题:
我正在使用 Xsd2Code 生成来自 XSD 的课程。 这正在发挥作用。
我已经尝试过这个:
private static string SerializeXML(Object obj)
{
XmlSerializer serializer = new XmlSerializer(obj.GetType(), "some.domain.api");
//settings
XmlWriterSettings settings = new XmlWriterSettings();
settings.Indent = true;
settings.OmitXmlDeclaration = true;
StringWriter stream = new StringWriter();
XmlWriter writer = XmlWriter.Create(stream, settings);
serializer.Serialize(writer, obj);
return stream.ToString();
}
但它产生了这个:
<Learner xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="some.domain.api">
<ActivationDate>1999-05-31T11:20:00</ActivationDate>
<EmailAddress>String content</EmailAddress>
<ExpirationDate>1999-05-31T11:20:00</ExpirationDate>
<FederalId>String content</FederalId>
<FirstName>String content</FirstName>
<Grade>K</Grade>
<LastName>String content</LastName>
<MiddleName>String content</MiddleName>
<UserName>String content</UserName>
<Password>String content</Password>
<SISId>String content</SISId>
<StateId>String content</StateId>
<Status>Active</Status>
</Learner>
我想摆脱 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www .w3.org/2001/XMLSchema”
。
怎样做?
更新
我也已经使用 XmlSerializerNamespaces
尝试过此操作。如果我添加这样的命名空间,使用上面的实现进行必要的调整:
XmlSerializerNamespaces namespaces =
new XmlSerializerNamespaces(new[] { new XmlQualifiedName("ns","some.domain.api") });
我得到这个:
<Learner xmlns:ns="some.domain.api">
但我需要这个:
<Learner xmlns="some.domain.api">
如果我添加这样的命名空间,使用上面的实现进行必要的调整:
XmlSerializerNamespaces namespaces =
new XmlSerializerNamespaces(new[] { XmlQualifiedName.Empty });
我得到这个:
<q1:Learner xmlns:ns="some.domain.api">
对于所有 XML 标签!
有什么办法可以得到我想要的输出吗?我真的不想使用 StringBuilder
来完成这项任务......
I need to generate the following XML:
<Learner xmlns="some.domain.api">
<ActivationDate>1999-05-31T11:20:00</ActivationDate>
<EmailAddress>String content</EmailAddress>
<ExpirationDate>1999-05-31T11:20:00</ExpirationDate>
<FederalId>String content</FederalId>
<FirstName>String content</FirstName>
<Grade>K</Grade>
<LastName>String content</LastName>
<MiddleName>String content</MiddleName>
<UserName>String content</UserName>
<Password>String content</Password>
<SISId>String content</SISId>
<StateId>String content</StateId>
<Status>Active</Status>
</Learner>
I have read these questions:
- How can I make the xmlserializer only serialize plain xml?
- Automatically generate XSD to C# in Visual Studio IDE
I am using Xsd2Code to generate the classes from XSD. That is working.
I have tried this:
private static string SerializeXML(Object obj)
{
XmlSerializer serializer = new XmlSerializer(obj.GetType(), "some.domain.api");
//settings
XmlWriterSettings settings = new XmlWriterSettings();
settings.Indent = true;
settings.OmitXmlDeclaration = true;
StringWriter stream = new StringWriter();
XmlWriter writer = XmlWriter.Create(stream, settings);
serializer.Serialize(writer, obj);
return stream.ToString();
}
But it produces this:
<Learner xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="some.domain.api">
<ActivationDate>1999-05-31T11:20:00</ActivationDate>
<EmailAddress>String content</EmailAddress>
<ExpirationDate>1999-05-31T11:20:00</ExpirationDate>
<FederalId>String content</FederalId>
<FirstName>String content</FirstName>
<Grade>K</Grade>
<LastName>String content</LastName>
<MiddleName>String content</MiddleName>
<UserName>String content</UserName>
<Password>String content</Password>
<SISId>String content</SISId>
<StateId>String content</StateId>
<Status>Active</Status>
</Learner>
I want to get rid of xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
.
How to?
Update
I have also already tried this using XmlSerializerNamespaces
. If I add namespaces like this, using my implementation above with the necessary adjustments:
XmlSerializerNamespaces namespaces =
new XmlSerializerNamespaces(new[] { new XmlQualifiedName("ns","some.domain.api") });
I get this:
<Learner xmlns:ns="some.domain.api">
But I need this:
<Learner xmlns="some.domain.api">
If I add namespaces like this, using my implementation above with the necessary adjustments:
XmlSerializerNamespaces namespaces =
new XmlSerializerNamespaces(new[] { XmlQualifiedName.Empty });
I get this:
<q1:Learner xmlns:ns="some.domain.api">
for all XML tags!
Is there any way I can do to get my desired output? I really don't want to use StringBuilder
for this task...
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
您可以像上面那样做:
并在编写文件后执行以下操作:
不是最优雅的,但它可以工作。
You can do as you did up there with:
and after writing the file do this:
Not the most elegant, but it works.
诀窍是为命名空间使用空名称:
然后为序列化过程添加它们:
这就是省略“ns:”的全部内容。
The trick is to use an empty name for the namespace:
Then you add them for the serialization process:
Thats all to omit the "ns:".
尝试这样的事情:
更新
如果您被迫使用固定的 xml 输出语法,您始终可以将返回的 xml 字符串“xmlns:bs”替换为“xmlns”!
try something like this:
updated
You can always replace the returning xml string "xmlns:bs" to "xmlns" if you are forced to a fixed xml output syntax!