Solved

recursiv search in a xml file

Posted on 2013-01-19
6
368 Views
Last Modified: 2013-02-08
Hi Everybody,

i'm looking for a solution to read an xml file recursiv.  (see attached xml file).
What i have is the "Filename", Filename = 193478618937468178.000.
Beginning from the the "Filename" i need the ID of the next node on the top.
From this ID i want to go to the next Childnode on the top, and so on.

Is there any idea how could i do this with Xpath and C# .net?

Sample:
Filename = 193478618937468178.000 --> goto ID = 2657
From
ID = 2657 --> goto ID = 1392
From
ID = 1392 --> goto ID = 8345
From
ID = 8345 --> goto ID = 1242
From
ID = 1242 --> goto ID = 39



Thank you in advance
Regards Bounty
xpath-Variant3.xml
0
Comment
Question by:bounty457
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 3
  • 3
6 Comments
 
LVL 60

Expert Comment

by:Geert Bormans
ID: 38796780
The most efficient way to do this, I think is by running a simple XSLT from C# on the document
You can pass in the file name as a parameter

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">
    
    <xsl:output method="text"/>
    <xsl:strip-space elements="*"/>
    
    <xsl:param name="fname">193478618937468178.000</xsl:param>
    <xsl:key name="object" match="Object" use="Fields/Field[@name='Filename']"/>
    
    <xsl:template match="/">
        <xsl:variable name="root-node" select="key('object', $fname)"/>
        <xsl:text>Filename = </xsl:text>
        <xsl:value-of select="$fname"/>
        <xsl:text> --> goto ID = </xsl:text>
        <xsl:apply-templates select="$root-node"/>       
    </xsl:template>
    
    <xsl:template match="*[@id]">
        <xsl:value-of select="@id"/>
        <xsl:if test="ancestor::*[@id]">
            <xsl:text>&#10;From&#10;ID = </xsl:text>
            <xsl:value-of select="@id"/>
            <xsl:text> --> goto ID = </xsl:text>
            <xsl:apply-templates select="ancestor::*[@id][1]"></xsl:apply-templates>
        </xsl:if>
    </xsl:template>
    
</xsl:stylesheet>

Open in new window

0
 
LVL 1

Author Comment

by:bounty457
ID: 38796829
Thank you for the answer.

Could you please short explain how must i use the code from C#?
i want do write the data for each "filename" a one datatable after parsing the xml.

Regards Bountry
0
 
LVL 60

Accepted Solution

by:
Geert Bormans earned 400 total points
ID: 38796874
Here is an example

http://msdn.microsoft.com/en-us/library/dfktf882%28v=vs.85%29.aspx

xslt.Load("discount.xsl");
put the name of your XSLT file there

drop the two DateTime lines

      argList.AddParam("discount", "", discountDate.ToString());
should be
      argList.AddParam("fname", "", "193478618937468178.000");
you can put in there any value you want

 XmlWriter writer = XmlWriter.Create("orderOut.xml");
is where you want the result to be

xslt.Transform(new XPathDocument("order.xml"), argList, writer);
pull in the right file
0
More Than Just A Video Library

Train for your certification. Learn the latest DevOps tools. Grow your skillset to do better work.

At Linux Academy, we release new training modules every week so you'll always be up to date on the latest tech.

 
LVL 1

Author Comment

by:bounty457
ID: 38797985
Hi,

the sample from MSDN work right. If i change the .xsl and .xml File
 
i get the message:
"Leerzeichen können aus bereits geladenen Eingabedokumenten nicht entfernt werden. Stellen Sie das Eingabedokument stattdessen als XmlReader bereit."
Translate:
"Use XMLReader - Empty Spaces can't delete from the source file"

I looked at MSDN:
http://msdn.microsoft.com/en-us/library/241y3z4e.aspx
I use the  XML Reader with the following code:
// Create the XslCompiledTransform and load the style sheet.
      XslCompiledTransform xslt = new XslCompiledTransform();
      string stylesheet = "Variant3.xsl";

//Create the reader to load the stylesheet.  
//Move the reader to the xsl:stylesheet node.
          XmlTextReader reader = new XmlTextReader(stylesheet);
          reader.Read();
          reader.Read();
          xslt.Load(reader);
// Create the XsltArgumentList.
          XsltArgumentList argList = new XsltArgumentList();
// Add my first Filename to the Arglist
          argList.AddParam("fname", "", "193478618937468178.000");
// Create an XmlWriter to write the output.             
         XmlWriter writer = XmlWriter.Create("Variant3_Out.xml");
// Transform the file.
         xslt.Transform(new XPathDocument("xpath_Variant3.xml"), argList, writer); 
        writer.Close();

Open in new window

Now i get the Message:

Das Stylesheet muss entweder mit einem 'xsl:stylesheet'- oder einem 'xsl:transform'-Element oder aber mit einem Literalergebniselement beginnen, welches das 'xsl:version'-Attribut aufweist. Dabei gibt das Präfix 'xsl' den Namespace 'http://www.w3.org/1999/XSL/Transform' an.
Translate:
"The Stylesheet must start with: xsl:stylesheet or xsl:transform element or an literal with 'xsl:version'-Attribut. The präfix must have the namespace http://www.w3.org/1999/XSL/Transform'
What must i add to the XSL File?

Regards Bounty
Variant3.xsl
0
 
LVL 60

Expert Comment

by:Geert Bormans
ID: 38798010
apparently you have not loaded the XSLT correctly, since the above code I posted has all it needs
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">

Can you check that it finds the XSLT file?
0
 
LVL 1

Author Comment

by:bounty457
ID: 38798033
Yes the File is found. The path is correct. It is a load Exception of the .xls File. It is working on your code?
I change the Variant3.xsl how you wrote.
I attached the screenshot from the error message.
Load-Exception.PNG
Variant3.xsl
0

Featured Post

Industry Leaders: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

Question has a verified solution.

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

Preface This article introduces an authentication and authorization system for a website.  It is understood by the author and the project contributors that there is no such thing as a "one size fits all" system.  That being said, there is a certa…
The Confluence of Individual Knowledge and the Collective Intelligence At this writing (summer 2013) the term API (http://dictionary.reference.com/browse/API?s=t) has made its way into the popular lexicon of the English language.  A few years ago, …
The viewer will learn how to dynamically set the form action using jQuery.
The viewer will learn how to look for a specific file type in a local or remote server directory using PHP.

728 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