Удалите diffgram и тег NewDataSet из XML в c #

1

Я хочу удалить diffgram и NewDataSet из xml.

<diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1">
 <NewDataSet>
  <MACNET diffgr:id="MACNET1" msdata:rowOrder="0" diffgr:hasChanges="inserted">
    <BATCH_ID>131070</BATCH_ID>
    <BATCH_Date_Submitted>12/1/2014 7:36:06 AM</BATCH_Date_Submitted>
    <BATCH_Date_Received>12/1/2014 7:36:06 AM</BATCH_Date_Received>
  </MACNET>
</NewDataSet>
</diffgr:diffgram>

Я создал этот xml из dataset помощью XmlSerializer. Я использовал следующий код.

           //Serialize dataset
            using (var memoryStream = new MemoryStream())
            {
                XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
                ns.Add("", "");

                using (TextWriter streamWriter = new StreamWriter(memoryStream))
                {
                    var xmlSerializer = new XmlSerializer(typeof(DataSet));
                    xmlSerializer.Serialize(streamWriter, ds, ns);
                    return Encoding.UTF8.GetString(memoryStream.ToArray());
                }
            }

Я хочу удалить <diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1"> и <NewDataSet> от xml. а также хотите удалить diffgr:id="MACNET1" msdata:rowOrder="0" diffgr:hasChanges="inserted" из тега MACNET. Как я могу удалить это?

Я хочу следующий тип вывода

<MACNET>
<BATCH_ID>131070</BATCH_ID>
<BATCH_Date_Submitted>12/1/2014 7:36:06 AM</BATCH_Date_Submitted>
<BATCH_Date_Received>12/1/2014 7:36:06 AM</BATCH_Date_Received>
</MACNET>
Теги:
dataset

1 ответ

2
Лучший ответ

Первое, что нужно сделать, - сериализовать DataSet помощью DataSet.GetXml(), DataSet.WriteXml() или DataTable.WriteXml(), а не пытаться сериализовать DataSet с помощью XmlSerializer. Это пропускает всю diffgram и дает следующий результат:

<NewDataSet>
  <MACNET>
    <BATCH_ID>131070</BATCH_ID>
    <BATCH_Date_Submitted>12/1/2014 7:36:06 AM</BATCH_Date_Submitted>
    <BATCH_Date_Received>12/1/2014 7:36:06 AM</BATCH_Date_Received>
  </MACNET>
</NewDataSet>

Теперь, в зависимости от того, как вы создали свой DataSet, корневой узел <NewDataSet> может отсутствовать, и все готово. Но если <NewDataSet> узел присутствует, и вы хотите, чтобы генерировать строку XML без него, вы можете использовать RootlessDataSetXmlWriter предложил здесь: Сохранение DataSet ds.WriteXml(...) без <NewDataSet> Tag? , с добавленным конструктором, который принимает TextWriter:

public class RootlessDataSetXmlWriter : ElementSkippingXmlWriter
{
    private readonly string _dataSetName;

    public RootlessDataSetXmlWriter(TextWriter stream, string dataSetName)
        : base(stream, (e) => string.Equals(e, dataSetName, StringComparison.OrdinalIgnoreCase))
    {
        _dataSetName = dataSetName;
        this.Formatting = System.Xml.Formatting.Indented;
    }

    public RootlessDataSetXmlWriter(Stream stream, string dataSetName)
        : base(stream, (e) => string.Equals(e, dataSetName, StringComparison.OrdinalIgnoreCase))
    {
        _dataSetName = dataSetName;
        this.Formatting = System.Xml.Formatting.Indented;
    }
}

public class ElementSkippingXmlWriter : XmlTextWriter
{
    private Predicate<string> _elementFilter;
    private int _currentElementDepth;
    private Stack<int> _sightedElementDepths;

    public ElementSkippingXmlWriter(TextWriter writer, Predicate<string> elementFilter)
        : base(writer)
    {
        _elementFilter = elementFilter;
        _sightedElementDepths = new Stack<int>();
    }

    public ElementSkippingXmlWriter(Stream stream, Predicate<string> elementFilter)
        : base(stream, Encoding.UTF8)
    {
        _elementFilter = elementFilter;
        _sightedElementDepths = new Stack<int>();
    }

    // Rest is as shown in the linked answer.
} 

И затем назовите его

        string xml;
        using (var textWriter = new StringWriter())
        using (var writer = new RootlessDataSetXmlWriter(textWriter, ds.DataSetName))
        {
            ds.WriteXml(writer);
            xml = textWriter.ToString();
        }

Это дает следующий результат:

<MACNET>
  <BATCH_ID>131070</BATCH_ID>
  <BATCH_Date_Submitted>12/1/2014 7:36:06 AM</BATCH_Date_Submitted>
  <BATCH_Date_Received>12/1/2014 7:36:06 AM</BATCH_Date_Received>
</MACNET>

который вам нужен. Однако обратите внимание, что если ваша корневая таблица MACNET имеет более одной строки, созданный XML будет недействительным, поскольку все документы XML должны иметь один и только один корневой тег.

  • 0
    Спасибо за ответ. Я попробовал твой код. Но это удаляет мою схему. Я не хочу удалять это.
  • 0
    @AjayPunekar - попробуйте использовать ds.WriteXml(writer, XmlWriteMode.WriteSchema) .
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню