3

XML ファイルの各 XML タグを表すインデントを含むテキスト ベースのファイルがあります。

このテキストを C# のサンプル XML に変換するにはどうすればよいですか?
私は少し迷っています。スペースを数えてリストを振り返り、いつタグを閉じる必要があるかを判断する必要があります。

sampleroot                                          
  rootHeader                                        
    miscInformation                                 
        Creation                                
        DocumentIdentification                              
            Identifier                          
            Message_Type                            
            Notes                           
        StandardDocumentationIdentification                             
            Standard                            
            Version                         
    Receiver                                    
        Name                                
        lok                             
        Location                                
    Sender                                  
        Name                                
        lok2                                
    msgref                                  
        DocumentIdentifier                              
        HoldInformation                             
            Name                            
            Date                            
        ReleaseInformation                              
            Date                            
    HoldDocumentReference                                   
        AlternativeIdentifier                               
            Authority                           
            Identifier                          
        Notes                               
    ReleaseDocumentReference                                    
        AlternativeIdentifier                               
            Authority                           
            Identifier                          
        Notes       
4

1 に答える 1

4

次のコードは、 4つのスペースインデントを持つ入力ドキュメントで機能します(入力ドキュメントを注意深く見てください)。これは単なる例です。もちろん、タブインデントを使用して入力ドキュメントのサポートを実装できます。

private static void ConvertToXml(Stream inputStream, Stream outputStream)
{
    const int oneIndentLength = 4; // One level indentation - four spaces.
    var xmlWriterSettings = new XmlWriterSettings
        {
            Indent = true
        };

    using (var streamReader = new StreamReader(inputStream))
    using (var xmlWriter = XmlWriter.Create(outputStream, xmlWriterSettings))
    {
        int previousIndent = -1; // There is no previous indent.
        string line;
        while ((line = streamReader.ReadLine()) != null)
        {
            var indent = line.TakeWhile(ch => ch == ' ').Count();
            indent /= oneIndentLength;

            var elementName = line.Trim();

            if (indent <= previousIndent)
            {
                // The indent is the same or is less than previous one - write end for previous element.
                xmlWriter.WriteEndElement();

                var indentDelta = previousIndent - indent;
                for (int i = 0; i < indentDelta; i++)
                {
                    // Return: leave the node.
                    xmlWriter.WriteEndElement();
                }
            }

            xmlWriter.WriteStartElement(elementName);

            // Save the indent of the previous line.
            previousIndent = indent;
        }
    }
}

クライアントコード:

using (var inputStream = File.OpenRead(@"Input file path"))
using (var outputStream = File.Create(@"Output file path"))
{
    ConvertToXml(inputStream, outputStream);
}

入力ドキュメント:

sampleroot
    rootHeader
        miscInformation
            Creation
            DocumentIdentification
                Identifier
                Message_Type
                Notes
            StandardDocumentationIdentification
                Standard
                Version
        Receiver
            Name
            lok
            Location
        Sender
            Name
            lok2
        msgref
            DocumentIdentifier
            HoldInformation
                Name
                Date
            ReleaseInformation
                Date
        HoldDocumentReference
            AlternativeIdentifier
                Authority
                Identifier
            Notes
        ReleaseDocumentReference
            AlternativeIdentifier
                Authority
                Identifier
            Notes

出力ドキュメント:

<?xml version="1.0" encoding="utf-8"?>
<sampleroot>
  <rootHeader>
    <miscInformation>
      <Creation />
      <DocumentIdentification>
        <Identifier />
        <Message_Type />
        <Notes />
      </DocumentIdentification>
      <StandardDocumentationIdentification>
        <Standard />
        <Version />
      </StandardDocumentationIdentification>
    </miscInformation>
    <Receiver>
      <Name />
      <lok />
      <Location />
    </Receiver>
    <Sender>
      <Name />
      <lok2 />
    </Sender>
    <msgref>
      <DocumentIdentifier />
      <HoldInformation>
        <Name />
        <Date />
      </HoldInformation>
      <ReleaseInformation>
        <Date />
      </ReleaseInformation>
    </msgref>
    <HoldDocumentReference>
      <AlternativeIdentifier>
        <Authority />
        <Identifier />
      </AlternativeIdentifier>
      <Notes />
    </HoldDocumentReference>
    <ReleaseDocumentReference>
      <AlternativeIdentifier>
        <Authority />
        <Identifier />
      </AlternativeIdentifier>
      <Notes />
    </ReleaseDocumentReference>
  </rootHeader>
</sampleroot>
于 2013-02-07T06:26:33.883 に答える