Я хочу удалить 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
помощью 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 должны иметь один и только один корневой тег.
ds.WriteXml(writer, XmlWriteMode.WriteSchema)
.