相关疑难解决方法(0)

XmlSerializer:删除不必要的xsi和xsd命名空间

有没有办法配置XmlSerializer,以便它不会在根元素中写入默认命名空间?

我得到的是这个:

<?xml ...>
<rootelement xmlns:xsi="..." xmlns:xsd="...">
</rootelement>
Run Code Online (Sandbox Code Playgroud)

我想删除两个xmlns声明.

重复:如何在不获取xmlns ="..."的情况下将对象序列化为XML?

.net xml xml-serialization

124
推荐指数
4
解决办法
10万
查看次数

如何在不获取xmlns ="..."的情况下将对象序列化为XML?

有没有办法让我在.NET中序列化一个对象,而XML Namespaces也不会自动序列化?似乎默认情况下.NET认为应该包含XSI和XSD名称空间,但我不希望它们存在.

.net xml-serialization xml-namespaces

102
推荐指数
5
解决办法
10万
查看次数

序列化对象时省略XML处理指令

我正在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)

.net c# visual-studio-2003 xml-serialization

10
推荐指数
3
解决办法
1万
查看次数

在没有名称空间的情况下反序列化XML,但是在期望名称空间的类中

重复:
序列化对象时省略所有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强制类命名空间定义.

c# xml-serialization

9
推荐指数
2
解决办法
2万
查看次数

从 xml 中删除 q1 和所有命名空间

我得到了一个 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)

c# xml namespaces

7
推荐指数
2
解决办法
7649
查看次数

停止DataContractSerializer放入命名空间?

我想将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传递给遗留组件.

datacontract datacontractserializer

5
推荐指数
0
解决办法
2830
查看次数

XML序列化期间将忽略属性XmlNamespaceDeclarations

我尝试使用自定义命名空间序列化对象.这就是这个类的样子:

[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属性?它不应该自动从它获取命名空间声明吗?如何在序列化类中定义名称空间?

提前致谢!

c# xml serialization xml-namespaces

3
推荐指数
1
解决办法
2519
查看次数

在嵌套属性上使用XmlAttributeOverrides

我试图使用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)

c# class xml-attribute xmlserializer xmlignore

2
推荐指数
2
解决办法
8371
查看次数