Home > Blockchain >  converting flat txt file to nested xml
converting flat txt file to nested xml

Time:08-06

I need to convert text file with some conversion columns-elements to an nested xml file -
for example
txt flat file - Name,Age,Street name,street number,city name
conversion table-
flat file - Name,Age,Street name,street number,city name
conversion table -

Name-FullName
Age-Age
Street Name-AddressDetail-StreetName
Street Number-AddressDetail-StreetNumber
City Name-AddressDetail-CityName

xml file

    <?xml version="1.0" encoding="UTF-8"?> 
    <Envelop>
       <FullName>Steve Mate</FullName>
       <Age>22</Age> 
       <AddressDetail>
               <StreetName>Rockford</StreetName>
               <StreetNumber>111</StreetNumber>
               <CityName>Alimena</CityName> 
       </AddressDetail>
    </Envelop>

What is the best way to implement it? Can it be used with MVC? Using XElement?

CodePudding user response:

The following code should work for you

var lines = text.Split(new[] {"\r", "\n", "\r\n"}, 0);
var xDoc = new XDocument(new XElement("Envelop"));
foreach (var line in lines)
{
    var values = line.Split('-');
    var parentNode = xDoc.Root;
    foreach (var value in values.Reverse().Skip(1))
    {
        var name = value.Replace(" ", "");
        var node = parentNode.Element(name);
        if (node == null)
        {
            node = new XElement(name);
            parentNode.Add(node);
        }
        parentNode = node;
    }
    parentNode.Value = values.Last();
}
  • Split the text based on newlines.
  • For each line, split it based on -
  • Take the root the starting node
  • For each value in the split line, skipping the first item...
    • Remove spaces (you can't have spaces in a node name).
    • Get the child node with that name
    • If it doesn't exist, create it.
    • Set the current parent as this node.
  • Finally set the value of this node to the last item in the split values

dotnetfiddle

Output:

<Envelop>
  <FullName>FullName</FullName>
  <Age>Age</Age>
  <AddressDetail>
    <StreetName>StreetName</StreetName>
    <StreetNumber>StreetNumber</StreetNumber>
    <CityName>CityName</CityName>
  </AddressDetail>
</Envelop>

CodePudding user response:

I've done similar a number of times.

There is no special trick to this. You will need to parse the input file to get the elements you need, and then you'll need to create an XML file with the data.

I don't know of any existing way to convert your particular text file format.

  • Related