有没有办法配置XmlSerializer,以便它不会在根元素中写入默认命名空间?
我得到的是这个:
<?xml ...>
<rootelement xmlns:xsi="..." xmlns:xsd="...">
</rootelement>
Run Code Online (Sandbox Code Playgroud)
我想删除两个xmlns声明.
有没有办法让我在.NET中序列化一个对象,而XML Namespaces也不会自动序列化?似乎默认情况下.NET认为应该包含XSI和XSD名称空间,但我不希望它们存在.
我正在C#VS2003/.Net 1.1应用程序中序列化一个对象.但是,我需要在没有处理指令的情况下进行序列化.XmlSerializer类推出类似这样的东西:
<?xml version="1.0" encoding="utf-16" ?>
<MyObject>
<Property1>Data</Property1>
<Property2>More Data</Property2>
</MyObject>
Run Code Online (Sandbox Code Playgroud)
有没有办法得到类似下面的内容,而不处理生成的文本删除标签?
<MyObject>
<Property1>Data</Property1>
<Property2>More Data</Property2>
</MyObject>
Run Code Online (Sandbox Code Playgroud)
对于那些好奇的人,我的代码看起来像这样......
XmlSerializer serializer = new XmlSerializer(typeof(MyObject));
StringBuilder builder = new StringBuilder();
using ( TextWriter stringWriter = new StringWriter(builder) )
{
serializer.Serialize(stringWriter, comments);
return builder.ToString();
}
Run Code Online (Sandbox Code Playgroud) 重复:
序列化对象时省略所有xml命名空间? 不一样..我想用另一种方式:反序列化!
我有一个C#类如下:
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.42")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace = "http://www.portalfiscal.inf.br/nfe")]
[System.Xml.Serialization.XmlRootAttribute("NFe", Namespace = "http://www.portalfiscal.inf.br/nfe", IsNullable = false)]
public partial class TNFe
{
private TNFeInfNFe infNFeField;
private SignatureType signatureField;
/// <remarks/>
public TNFeInfNFe infNFe
{ ...
Run Code Online (Sandbox Code Playgroud)
我使用这个类来按用户请求序列化/反序列化XML文件.但是我遇到了一个问题:在这个软件的新版本中添加了名称空间定义.XML仍然是相同的,只添加名称空间定义.
例如,最后一个版本......
<?xml version="1.0" encoding="utf-8" ?>
<NFe>
<infNFe version="1.10">
...
Run Code Online (Sandbox Code Playgroud)
和新版本......
<?xml version="1.0" encoding="utf-8" ?>
<NFe xmlns="http://www.portalfiscal.inf.br/nfe">
<infNFe version="2.10">
...
Run Code Online (Sandbox Code Playgroud)
我需要加载带有和不带这些名称空间的XML文件.我有很多嵌套类,每个嵌套类都有自己的命名空间定义.
我想对两个XML使用相同的类,有和没有名称空间.
我试图创建一个XmlTextReader并覆盖NamespaceURI方法,但我仍然收到一个没有太多信息的异常.我认为.NET引擎正在尝试针对XML强制类命名空间定义.
我得到了一个 xsd 生成的 C# POCO 对象,我需要将其转换为 xml。然而,预期的有效载荷与我得到的 xsds 不匹配。具体来说,我需要省略声明并从 xml 对象中删除所有命名空间,以便相关公司接受 API 请求。
问题
给定一个类型为 T 的对象,我想在没有声明和命名空间的情况下对其进行序列化。
我已经摆脱了大部分,但由于某种原因,q1 已添加到每个元素中。我如何删除它?
试图
经过一些研究,我看到一些帖子提供了一个解决方案,该解决方案创建一个空的 xml 序列化器命名空间并使用该对象调用序列化器。那只让我成功了一半。
用法
var ns = new XmlSerializerNamespaces();
ns.Add("", "");
var body = payload.SerializeObject(false, true, ns);
Run Code Online (Sandbox Code Playgroud)
扩展方法
public static string SerializeObject<T>(this T obj, bool indented, bool omitDeclaration, XmlSerializerNamespaces ns)
{
var utf8NoBom = new UTF8Encoding(false);
var settings = new XmlWriterSettings
{
OmitXmlDeclaration = omitDeclaration,
Indent = indented,
Encoding = utf8NoBom
};
using (MemoryStream ms = new MemoryStream())
{
using …Run Code Online (Sandbox Code Playgroud) 我想将datacontract类序列化为XMl,但没有命名空间.
我已经添加:
[DataContract(Namespace="")]
Run Code Online (Sandbox Code Playgroud)
但我仍然得到:
<Person xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<Title>Mr</Title>
...
</Person>
Run Code Online (Sandbox Code Playgroud)
有没有办法阻止这种情况发生,因为我只想将干净的xml传递给遗留组件.
我尝试使用自定义命名空间序列化对象.这就是这个类的样子:
[XmlRoot("Root", Namespace = "myNamespace")]
public partial class MyClass
{
public MyClass()
{
this.Xmlns = new XmlSerializerNamespaces();
this.Xmlns.Add(string.Empty, "myNamespace");
}
[XmlNamespaceDeclarations()]
public XmlSerializerNamespaces Xmlns = null;
}
Run Code Online (Sandbox Code Playgroud)
以下是序列化它的代码:
XmlSerializer serializer = new XmlSerializer(typeof(MyClass));
serializer.Serialize(xmlWriter, obj);
Run Code Online (Sandbox Code Playgroud)
预期的结果是
<Root xmlns="myNamespace" />
Run Code Online (Sandbox Code Playgroud)
但是它仍然有xmlns:xsi和xmlns:xsd属性:
<Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="myNamespace" />
Run Code Online (Sandbox Code Playgroud)
当我序列化使用时serializer.Serialize(xmlWriter, obj, obj.Xmlns),结果是正确的.
为什么序列化程序会忽略该XmlNamespaceDeclarations属性?它不应该自动从它获取命名空间声明吗?如何在序列化类中定义名称空间?
提前致谢!
我试图使用XmlAttributeOverrides来控制哪些类属性在序列化后显示在xml中。它适用于“根”类上的属性,但不适用于嵌套属性。这是一个简单的示例,以说明我要完成的工作。
我的班级层次结构如下:
public class Main
{
public string Name { get; set; }
public Location Address { get; set; }
}
public class Location
{
public string StreetAddress { get; set; }
public Contact ContactInfo{ get; set; }
}
public class Contact
{
public string PhoneNumber { get; set; }
public string EmailAddr { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
当我序列化Main()时,我得到如下信息:
<Main>
<Name></Name>
<Address>
<StreetAddress></StreetAddress>
<ContactInfo>
<PhoneNumber></PhoneNumber>
<EmailAddr></EmailAddr>
</ContactInfo>
</Address>
</Main>
Run Code Online (Sandbox Code Playgroud)
我所能做的就是通过使用以下命令来避免显示名称或地址:
XmlAttributeOverrides overrides = new XmlAttributeOverrides();
XmlAttributes attribs = new XmlAttributes(); …Run Code Online (Sandbox Code Playgroud)