Reputation: 666
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
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
Reputation: 109080
Your code is almost correct:
XML is case sensitive, so
str.Elements("DATA")
is not going to find anything, you need:
str.Elements("data")
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