|
#1
|
|||
|
|||
Read nodes from an XML file
I have an XML file like:
<?xml version="1.0"?> <log> <logentry revision="28617"> <author>John Doe</author> <date>2007-08-21T13:51:44.617641Z</date> <paths> <path action="M">/sources/trunk/Controls/Grids/MyGrid.cs</path> <path action="A">/sources/trunk/3rdPartyLibs/Infragistics/Infragistics2.Win.UltraWinGrid.ExcelExport.v7.1.xm l</path> <path action="M">/sources/trunk/MyProj/Pro.csproj</path> </paths> <msg>Issue: Fixed some error...</msg> </logentry> <logentry revision="28618"> <author>me</author> <date>2007-08-21T14:11:50.500926Z</date> <paths> <path action="M">/sources/trunk/Exchange/Server/Triggers/TriggerProvider.cs</path> <path action="M">/sources/trunk/Exchange/Server/OrderControllers/OrderControler.cs</path> <path action="M">/sources/trunk/Exchange/Server/Sessions/Wrapper.cs</path> </paths> <msg>Issue: Removed Trigger</msg> </log> I need to read all the paths <path> and to put them in a text file line by line. Any idea how I can do this in VBP? I looked at the sample XML.bld but there is a different parsing ,for attributes,I did not succed to pars it the way I need... Thanks for any help |
#2
|
|||
|
|||
Using an XSL transform would be one way (see attached sample).
|
#3
|
|||
|
|||
Thanks a lot,it works perfectly!
I just noticed sometimes the paths are not unique as the same file was modified in multiple revisions.Is it possible to change the XSL file in order to produce unique paths (every path should appear only once)?(I do not have any experience with XSL) Or I should parse separately the output text fle in order to create another text file with unique paths? |
#4
|
|||
|
|||
In the 'Create XSL file' step, replace
<xsl:for-each select="//path"> with <xsl:for-each select="//path[[not(.=preceding::path)]]"> |
#5
|
|||
|
|||
Tried that but the step fails:
8/24/2007 11:19:59 AM: Building project step 'Generate text file(containing paths)'... Loading XML input document... Loading XSLT stylesheet... Initializing XSLT processor... Expression expected. //path[-->[<--not(.=preceding::path)]] 8/24/2007 11:19:59 AM: Step 'Generate text file(containing paths)' failed 8/24/2007 11:19:59 AM: Build ended. XSL file looks now like this: <?xml version="1.0"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="text"/> <xsl:template match="/"> <xsl:for-each select="//path[[not(.=preceding::path)]]"> <xsl:value-of select="."/><xsl:text>
</xsl:text> </xsl:for-each> </xsl:template> </xsl:stylesheet> |
#6
|
|||
|
|||
Please ZIP and send or post:
1) The info from Help | About | Install Info 2) The version(s) of MSXML installed (listed in Add/Remove Programs) |
#7
|
|||
|
|||
1)
Visual Build Professional 6.3 Registered to: xxxxxxxxxx (1-computer license) Windows Version: 5.1.2600.2.0 Install path: D:\Program Files\VisBuildPro6 SftTree_IX86_U_50.dll version 5.05 unins000.exe version 51.46.0.0 VisBuildCmd.exe version 6.3.0.0 VisBuildPro.exe version 6.3.0.0 VisBuildBld.dll version 6.3.0.0 VisBuildBurn.dll version 6.3.0.0 VisBuildCore.dll version 6.3.0.0 VisBuildDotNET.dll version 6.3.0.0 VisBuildExt.dll version 6.3.0.0 VisBuildLog.dll version 6.3.0.0 VisBuildMisc.dll version 6.3.0.1 VisBuildMS.dll version 6.3.0.0 VisBuildMS2.dll version 6.3.0.0 VisBuildNet.dll version 6.3.0.0 VisBuildSvr.dll version 6.3.0.0 VisBuildSvr.Interop.dll version 1.0.0.0 VisBuildVCS.dll version 6.3.0.0 2)It appears MSXML 4.0 SP2 and also MSXML 6.0 parser |
#8
|
|||
|
|||
If you're putting the expression in the XSLT file itself (rather than the Create XSL File step as suggested), use single brackets instead of double:
<xsl:for-each select="//path[not(.=preceding::path)]"> |
#9
|
|||
|
|||
Thanks,with single brackets works ok:
<xsl:for-each select="//path[not(.=preceding::path)]"> |
#10
|
|||
|
|||
Well,another issue appeared :-(
I need to read line by line the text file produced by transformation. I use a set macro step in order set a macro CURRENT_LINE to value [vbld_TempMacroObj("FILE").ReadLine()] However -the macro remains empty. I tried even to set a macro FILE_CONTENT to value: [vbld_GetFileContents("%CHANGED_FILES_TXT%")] but the resulting value is always : ÿþ/ I do not understand what is the issue... |
#11
|
|||
|
|||
Ok,I finally got it,text file is encoded in Unicode so it should be read like this:
[vbld_EscapeString(vbld_FSO.OpenTextFile("%CHANGED_ FILES_TXT%", , , True).ReadAll)] |
#12
|
|||
|
|||
You originally indicated you wanted to put the values into a text file. To instead iterate over the matches within VBP, just use that XPath expression in an MSXML query (see attached sample).
|
#13
|
|||
|
|||
I see,thanks a lot for sample!
|
#14
|
|||
|
|||
In the last sample (transform3.bld)-how can I write in log-step "Do stuff with node value"- >for every path the related revision (written in <logentry
revision="xxxxx">)? Basically one logentry has one revision and multiple paths. |
#15
|
|||
|
|||
Attached.
|
|
|