Разобрать пустое поле до XML - PullRequest
1 голос
/ 19 марта 2020

Я анализирую класс с пустой строкой в ​​некотором элементе в файле XML, как показано ниже.

objectCxml.Request.InvoiceDetailRequest.InvoiceDetailRequestHeader.InvoiceDetailHeaderIndicator = "";
XmlSerializer s = new XmlSerializer(typeof(cXML));
XmlTextWriter tw = new XmlTextWriter(path, Encoding.UTF8);
s.Serialize(tw, objectCxml);  

Он генерирует xml как показано ниже

<InvoiceDetailHeaderIndicator xsi:type="xsd:string"/>

Но я хочу это как показано ниже

<InvoiceDetailHeaderIndicator/>

Есть предложения?

1 Ответ

1 голос
/ 19 марта 2020

Свойство InvoiceDetailHeaderIndicator равно object

Так ... не делайте этого? Сделайте это string, и вы должны быть настроены.

В конечном счете, суть в том, что XmlSerializer хочет иметь возможность надежно обрабатывать данные в обоих направлениях; это его работа. Есть два способа сделать это:

  1. знать тип статически (т.е. string вместо object в модели типов)
  2. вставлять дополнительные метаданные в полезную нагрузку (xsi:type="xsd:string")

Если вы не хотите 2, вам понадобится 1, иначе не может работать . Откровенно говоря, 1 - гораздо лучшая идея в любом случае .

Я проверил с локальной минимальной настройкой, и это сработало нормально:

public class InvoiceHeaderThing
{
    public string InvoiceDetailHeaderIndicator { get; set; }
}

Полный код ниже:

using System;
using System.IO;
using System.Text;
using System.Xml;
using System.Xml.Serialization;

static class P
{
    static void Main()
    {
        const string path = "my.xml";

        var objectCxml = new cXML();
        objectCxml.Request.InvoiceDetailRequest.InvoiceDetailRequestHeader.InvoiceDetailHeaderIndicator = "";
        XmlSerializer s = new XmlSerializer(typeof(cXML));
        using (XmlTextWriter tw = new XmlTextWriter(path, Encoding.UTF8))
        {
            s.Serialize(tw, objectCxml);
        }

        Console.WriteLine(File.ReadAllText(path));
    }
}

public class cXML
{
    public RequestThing Request { get; set; } = new RequestThing();
}
public class RequestThing
{
    public InvoiceDetailThing InvoiceDetailRequest { get; set; } = new InvoiceDetailThing();
}
public class InvoiceDetailThing
{
    public InvoiceHeaderThing InvoiceDetailRequestHeader { get; set; } = new InvoiceHeaderThing();
}
public class InvoiceHeaderThing
{
    public string InvoiceDetailHeaderIndicator { get; set; }
}
...