VARUN NAYAK
VARUN NAYAK

Reputation: 666

Store element from XML

I have one XML file::

<data>

    <find>TAG11</find>
    <data_type>Static Data</data_type>
    <static_value>Varun</static_value>
    <field_name>Not Applicable</field_name>
    <table_name>Batch_Master</table_name>
</data>

<data>
    <find>VAL1</find>
    <data_type>Dynamic Data</data_type>
    <static_value>Not Applicable</static_value>
    <field_name>Product Name</field_name>
    <table_name>Batch_Master</table_name>
</data>

<data>
    <find>TAG1</find>
    <data_type>Dynamic Data</data_type>
    <static_value>Not Applicable</static_value>
    <field_name>Country Name</field_name>
    <table_name>Batch_Master</table_name>
</data>

<data>
    <find>VAL11</find>
    <data_type>Static Data</data_type>
    <static_value>Nayak</static_value>
    <field_name>Not Applicable</field_name>
    <table_name>Batch_Master</table_name>
</data>

<data>
    <find>VAL2</find>
    <data_type>Dynamic Data</data_type>
    <static_value>Not Applicable</static_value>
    <field_name>Batch Code</field_name>
    <table_name>Batch_Master</table_name>
</data>

<data>
    <find>TAG12</find>
    <data_type>Dynamic Data</data_type>
    <static_value>Not Applicable</static_value>
    <field_name>Carton Number</field_name>
    <table_name>Batch_Master</table_name>
</data>

<data>
    <find>VAL3</find>
    <data_type>Dynamic Data</data_type>
    <static_value>Not Applicable</static_value>
    <field_name>Product Strength</field_name>
    <table_name>Batch_Master</table_name>
</data>

<data>
    <find>TAG10</find>
    <data_type>Not Selected</data_type>
    <static_value>Not Applicable</static_value>
    <field_name>Not Selected</field_name>
    <table_name>Batch_Master</table_name>
</data>

Now I need to store find, and static_value values in string only when data_type is Static Data,

I dont have much idea about XMLtoLinq bt I write this function

var xmlStr = File.ReadAllText(@"D:\Test\DATA020913.xml");
var str = XElement.Parse(xmlStr);
var result = str.Elements("DATA")
    .Where(x => x.Element("Data_Type").Value.Equals("Static Data")).ToList();
MessageBox.Show(result.ToString());   

Console.WriteLine(result);

by this I getting Only Number Of times static data comes, bt i also want values of find, and static_value values in variable

FYI:: later on I will replace this varibles values in my text file.

Upvotes: 2

Views: 101

Answers (2)

Marc Gravell
Marc Gravell

Reputation: 1063013

Something like:

var doc = XDocument.Parse(xmlStr);
var data = (from el in doc.Root.Elements("data")
            where (string)el.Element("data_type") == "Static Data"
            select new
            {
                Find = (string)el.Element("find"),
                StaticValue = (string)el.Element("static_value")
            }).ToList();
foreach (var el in data)
{
    Console.WriteLine("{0}, {1}", el.Find, el.StaticValue);
}

?

Outputs:

TAG11, Varun
VAL11, Nayak

Alternatively, consider using XmlSerializer to deserialize the data into an object model instead. For example:

SomeRootElement root;
using (var sr = new StringReader(xmlStr))
using (var xr = XmlReader.Create(sr))
{
    var ser = new XmlSerializer(typeof(SomeRootElement));
    root = (SomeRootElement)ser.Deserialize(xr);
}

var items = from item in root.Items
            where item.DataType == DataType.StaticData
            select item;
foreach (var item in items)
{
    Console.WriteLine("{0}, {1}", item.Find, item.StaticValue);
}

using the model:

public enum DataType
{
    [XmlEnum("Static Data")]
    StaticData,
    [XmlEnum("Dynamic Data")]
    DynamicData,
    [XmlEnum("Not Selected")]
    NotSelected
}
[XmlRoot("xml")]
public class SomeRootElement
{
    private readonly List<DataItem> items = new List<DataItem>();
    [XmlElement("data")]
    public List<DataItem> Items { get { return items; } }
}
public class DataItem
{
    [XmlElement("find")]
    public string Find { get; set; }
    [XmlElement("data_type")]
    public DataType DataType { get; set; }
    [XmlElement("static_value")]
    public string StaticValue { get; set; }
    [XmlElement("field_name")]
    public string FieldName { get; set; }
    [XmlElement("table_name")]
    public string TableName { get; set; }
}

Upvotes: 2

Richard
Richard

Reputation: 109080

Your code is almost correct:

  1. XML is case sensitive, so

    str.Elements("DATA")
    

    is not going to find anything, you need:

    str.Elements("data")
    
  2. result will be a List<XElement>, which won't give you anything useful when you use its ToString method. Rather you need to iterate through the list to extract the information from each XElement in turn:

    foreach (var el in result) {
      var findValue = el.Element("find").Value;
      var staticValue = el.Element("static_value");
      // Do something with the data.
    }
    

Suggestion: drop the ToList call when getting the result, converting the IEnumerable<XElement> into a List<XElement> is only consuming CPU cycles and memory for no benefit.

Upvotes: 0

Related Questions