Solved

Query an xml file

Posted on 2014-01-17
3
567 Views
Last Modified: 2014-01-22
I have an xml file, that consists of the following structure.

<XtraSerializer version="1.0" application="PivotGridControl">
  <property name="#LayoutVersion" isnull="true" />
  <property name="$PivotGridControl" iskey="true" value="PivotGridControl">
    <property name="Fields" iskey="true" value="41">
      <property name="Item1" isnull="true" iskey="true">
        <property name="AreaIndex">0</property>
        <property name="Name">fieldCode</property>
        <property name="Area">RowArea</property>
        <property name="FilterValues" isnull="true" iskey="true">
          <property name="DeferFilterString" />
          <property name="ValuesCore" iskey="true" value="0" />
          <property name="Values">~Xtra#Array0, </property>
          <property name="ShowBlanks">true</property>
          <property name="FilterType">Excluded</property>
        </property>
      </property>
      <property name="Item2" isnull="true" iskey="true">
        <property name="AreaIndex">1</property>
        <property name="Name">fieldGroup</property>
        <property name="Area">RowArea</property>
        <property name="FilterValues" isnull="true" iskey="true">
          <property name="DeferFilterString" />
          <property name="ValuesCore" iskey="true" value="0" />
          <property name="Values">~Xtra#Array0, </property>
          <property name="ShowBlanks">true</property>
          <property name="FilterType">Excluded</property>
        </property>
      </property>
         <property name="Item3" isnull="true" iskey="true">
        <property name="AreaIndex">2</property>
        <property name="Name">fieldProduct</property>
        <property name="Area">ColumnArea</property>
        <property name="FilterValues" isnull="true" iskey="true">
          <property name="DeferFilterString" />
          <property name="ValuesCore" iskey="true" value="0" />
          <property name="Values">~Xtra#Array0, </property>
          <property name="ShowBlanks">true</property>
          <property name="FilterType">Excluded</property>
        </property>
      </property>
      </property>
</XtraSerializer>

I need to loop through all the Items under the element Fields and get the Name and Area attribtutes for each Item
Basically loop through this node
    <property name="Fields" iskey="true" value="41">
0
Comment
Question by:countrymeister
  • 2
3 Comments
 
LVL 62

Expert Comment

by:Fernando Soto
ID: 39789681
Hi countrymeister;

The following is using Linq to XML to return the property nodes who's attributes are either name="Name" or name="Area"

// If the XML document is stored on the file system use this line and replace the file path with the one that points to the loction and name of yours.
XDocument doc = XDocument.Load("C:/Working Directory/XtraSerializer.xml");
// Or use this line if the XML is stored in a string in your program replacing VariableNameHere with the actual variable name hollding the XML.
XDocument doc = XDocument.Parse(VariableNameHere);

var results = from nodes in doc.Descendants("property")
              where nodes.Attribute("name").Value == "Fields"
              from node in nodes.Elements("property").Descendants("property")
              where node.Attribute("name").Value == "Name" || node.Attribute("name").Value == "Area"
              select node;

Open in new window

0
 
LVL 1

Author Comment

by:countrymeister
ID: 39789703
Hi ! FernandoSoto

I need all the Items that have aboth these attributes, because sone of my nodes could have only the name and no area attribute.
0
 
LVL 62

Accepted Solution

by:
Fernando Soto earned 500 total points
ID: 39789921
Try this.

var results = from nodes in doc.Descendants("property")
              where nodes.Attribute("name").Value == "Fields"
              from node in nodes.Elements("property")
              let name = node.Elements("property").Where(n => n.Attribute("name").Value == "Name").FirstOrDefault()
              let area = node.Elements("property").Where(n => n.Attribute("name").Value == "Area").FirstOrDefault()
              where name != null && area != null
              select new
              {
                  name,
                  area
              };

foreach(var pairOfNodes in results)
{
    MessageBox.Show(pairOfNodes.name + " : " + pairOfNodes.area);
}

Open in new window

0

Featured Post

Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

I was working on a PowerPoint add-in the other day and a client asked me "can you implement a feature which processes a chart when it's pasted into a slide from another deck?". It got me wondering how to hook into built-in ribbon events in Office.
Entity Framework is a powerful tool to help you interact with the DataBase but still doesn't help much when we have a Stored Procedure that returns more than one resultset. The solution takes some of out-of-the-box thinking; read on!
Get a first impression of how PRTG looks and learn how it works.   This video is a short introduction to PRTG, as an initial overview or as a quick start for new PRTG users.
You have products, that come in variants and want to set different prices for them? Watch this micro tutorial that describes how to configure prices for Magento super attributes. Assigning simple products to configurable: We assigned simple products…

932 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

11 Experts available now in Live!

Get 1:1 Help Now