2014-12-08 1 views
1

xml에서 diffgramNewDataSet 태그를 제거하고 싶습니다.XML에서 diffgram 및 NewDataSet 태그를 C#

<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> 

나는 XmlSerializer를하여 dataset에서이 XML을 생성했다. 다음 코드를 사용했습니다.

  //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()); 
       } 
      } 

나는 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"을 삭제하고 싶습니다. 어떻게 제거 할 수 있습니까?

내가 출력

<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> 

답변

2

먼저 할 일은 다음과 같은 유형을 원하는 것은 오히려 XmlSerializer으로 DataSet를 직렬화하려고하지 않고, DataSet.GetXml(), DataSet.WriteXml() 또는 DataTable.WriteXml() 방법을 통해 DataSet를 직렬화하는 것입니다. 이 모든 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> 노드가 존재하고, 당신이 RootlessDataSetXmlWriter 여기 제안 사용할 수 있습니다, 그것은하지 않고 XML 문자열을 생성 싶은 경우 : 다음

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. 
} 

과 같이 호출 : 추가 된 생성자, Save a DataSet ds.WriteXml(…) without <NewDataSet> Tag?을 그건 TextWriter 받아 당신이 무엇을 필요로되는

<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> 

:

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

다음과 같은 출력을 제공합니다 . 그러나 루트 MACNET 테이블에 두 개 이상의 행이있는 경우 all XML documents must have one and only one root tag부터 생성 된 XML이 유효하지 않습니다.

+0

답장을 보내 주셔서 감사합니다. 나는 당신의 코드를 시도했다. 하지만 그것은 내 스키마를 제거합니다. 나는 그것을 제거하고 싶지 않다. –

+0

@AjayPunekar - ['ds.WriteXml (writer, XmlWriteMode.WriteSchema)'] (http://msdn.microsoft.com/en-us/library/system.data.xmlwritemode%28v=vs.110%)를 사용해보십시오. 29.aspx) 과부하. – dbc

+0

@AjayPunekar - 또는 스키마를 작성하려면 ['ds.WriteXmlSchema (writer)'] (http://msdn.microsoft.com/en-us/library/1a1f26zy%28vs.110%29.aspx)를 사용하십시오 다중 루트 XML 문서에 문제가있는 경우를 대비하여 별도의 문자열로 변환하십시오. – dbc

관련 문제