|
Hvala,
najlepse na analizi i predlozima za poboljsanje.
U planu mi je da izbacim novu klasu (i prateci clanak naravno) za rad sa HTML/XML dokumentima koja je nedavno zavrsena.
Nadam se da ce ona biti od vece koristi C++ programerima nego ova koja (objektivno) ima puno nedostataka.
Pozdrav,
Darkoman
"Avaritia est radix omnium malorum..."
|
|
|
|
|
|
Hi,
I can't load this xml file:
<test>
<property title="math">Big Test
<test>
<property title="math2">Small Test
when I'm changing the inner <test> to <test2> it works fine.
Does it support nested elements with the same name?
Thanks,
Yuval
|
|
|
|
|
I ran into a couple problems during LoadFromFile in .NET 2003.
1. dwAttributeOffset was not initialized before use in ParseXMLElement(). I initialized it to zero at definition with no obvious problems.
2. Corrupted the stack. I haven't tracked this down yet. It was detected by the debug runtime at ParseXMLElement() exit.
In fairness, the XML file I tried was large and maybe not quite the model in mind during the code design. Nothing fancy in the XML. All simple tags (e.g., <tag>aaaaa) other than the first line.
Larry
|
|
|
|
|
Hello,
can you please submit the XML file you have tried to parse, or just a part of it?
Thank you.
Best regards,
Darkoman"Avaritia est radix omnium malorum..."
|
|
|
|
|
I'll try to get a piece of the file that will still produce the problems. The file is currently about 15MB (I did say large).
Larry
|
|
|
|
|
If you have iTunes (or know someone locally that has it) you may be able to create a similar XML file. On iTunes File=>Export->Library will produce an XML file with data about the items in the library (title, artist, composer, etc) and playlists. I tried another small XML parser and it didn't like the
|
|
|
|
|
1. there was no indentation
2. I needed to create the root by myself. didn't get it automatically. did I miss something?
3. the root was not written to file, (so internet explorer could not show it)
4. if I open it as a text file, there is no indentation
|
|
|
|
|
|
Hello, Darko
I debugged your code and found myself repeating on loops every inner tag.
I did not try to rewrite yet, but I wonder if you missed the performance issue and it can be done on better performance or I am the one who misses something.
thanks
|
|
|
|
|
Hello,
thanks for the interest in this work.
Yes, you are right, I am using recursion to parse the XML file, although it could be done using just plain stack.
Using the stack would for sure increase the overall performance of this XML parser.
I will try to find the time to implement this second solution you have suggested.
Best regards,
Darkoman
"Avaritia est radix omnium malorum..."
|
|
|
|
|
It would be nice, if the authors assume ansi-c++ standard to produce articles like this. In fact, then "the rest of us" will also be able to use it. I do not hate MS Windows and its' product, it is just the matter of taste. But, as you see, a brilliant author, Mr darkoman, who has written this beautiful article, very nice article, but you know, it is useless for "the rest of the us" who do not use CString and DWORD and many more macros like these.
Rajesh Karan
|
|
|
|
|
Hello,
thanks for the interest in this article.
The main goal in this article was not to produce an "ansi-c++ standard XML file parser", but to help certain number of developers working with MS Visual Studio. This might be, however, a mistake not to take care about other developers not using this tool.
But, this is also a "pilot-article". If it lives long enough to see the future versions, the final one would for sure be a non-MFC dependent one.
That was my goal many times, writing other articles for the CodeProject.
I thank you for the positive criticism...
Best regards,
Darkoman
"Avaritia est radix omnium malorum..."
|
|
|
|
|
Hello friend ,
I used your class in my code. it is simple and easy to understand.
by using ur class, i added some nodes..
But now i have a problem...
1. how can i delete a node
2. how can i modify the content of a node..
for eg.
<main>
<add1>
<new1>10</new1>
<new1>50</new1>
</add1>
</main>
How to edit content <new1> tag like 10 to 20.
How to delete node <new2> tag.
|
|
|
|
|
It looks like the parser can not work through reserved characters in the data of an element. Notice that the "=" at the end of the GUID will cause the parser to terminate the data collection and enter the Attribute collection.
<objects xmlns="http://yahoo.com/objects">
<guid>kzpccGRdnX7t71ROn4PG0Q==
|
|
|
|
|
|
Hi, i am very interesting on this XML parser class.. currently i am doing my school project and i try to use this parser to parse my XML file.
But it fail.. My XML file able to open in IE browser so means the format should be correct. Izit there is any congfiguration i need to change?
XML file content:
<?xml version="1.0" encoding="UTF-8"?>
<skin>
<manifest name="SONcommunicator Gray" author="CaryCui" description="System defulat skin " version="1.0" type="Skin" />
<fonts>
<font name="Panel.Caption" face="Tohoma" size="12" weight="plain"/>
</fonts>
<colourScheme>
<colour name="System.Base.Window" value="FFFFFF"/>
<colour name="System.Base.Midtone" value="FFFFFF"/>
<colour name="System.Back.Selected" value="B9CFFF"/>
<colour name="System.Back.Checked.Selected" value="FFFFFF"/>
<colour name="System.Margin" value="FFFFFF"/>
<colour name="Panel.Caption.Text" value="000000"/>
<colour name="Panel.Caption.Back" value="000000"/>
<colour name="TaskPanel.Back" value="EEEEEE"/>
<colour name="System.Shadow" value="D6D4D7"/> <!-- menu icon mouseover hovers -->
<colour name="System.Border" value="7C7E7C"/> <!-- menu hover border colour -->
<colour name="System.Disabled" value="7C7E7C"/> <!-- item inactive/disabled colour -->
<colour name="System.Text" value="000000"/> <!-- active menu / item text colour -->
<colour name="MainDialog.Backgroud" value="FFFFFF"/>
<colour name="Dialog.Background" value="FFFFFF"/>
<colour name="MainHeader.Board" value="6A9FE1" />
<colour name="MainHeader.BodyStart" value="C2DAFC" />
<colour name="MainHeader.BodyEnd" value="E9F0FF" />
<colour name="MainHeader.BodyShadow" value="C2DAFC" />
<colour name="MainHeader.BodyGrid" value="E9F0FF" />
<colour name="MainTab.Board" value="E2E2DA" />
<colour name="MainTab.BodyFill" value="FFFFFF" />
<colour name="MainTab.BodyShadow" value="ECEBE6" />
<colour name="MainTab.ItemBoard" value="C8C6B7" />
<colour name="MainTab.ItemFill" value="E8E8E0" />
<colour name="FolderBarCtrl.BodyStart" value="C4DBFC" />
<colour name="FolderBarCtrl.BodyEnd" value="E9F0FF" />
</colourScheme>
<watermarks>
<watermark target="MainMenuBarBK" path="DialogToolBarBK.bmp"/>
<watermark target="DialogToolBarBK" path="DialogToolBarBK.bmp"/>
<watermark target="MainDialogBK" path="MainDialogBK.bmp"/>
</watermarks>
<WindowSkins>
<WindowSkin>
<image path="SONmobileGUI.bmp"/>
<image path="DialogBK.bmp" type="watermark"/>
<target window="MainDialog"/>
<target window="ChatDialog"/>
<parts>
<part name="TopLeft" rect="0,0,26,26"/>
<part name="Top" rect="30,0,60,26"/>
<part name="TopRight" rect="212,0,70,26"/>
<part name="Left" rect="0,26,2,530"/>
<part name="Right" rect="280,26,2,530"/>
<part name="BottomLeft" rect="0,561,10,3"/>
<part name="Bottom" rect="10,561,60,3"/>
<part name="BottomRight" rect="272,561,10,3"/>
<part name="MinimiseDown" rect="224,5,16,16"/>
<part name="MinimiseHover" rect="224,223,16,16"/>
<part name="MaximiseDown" rect="241,5,16,16"/>
<part name="MaximiseHover" rect="241,223,16,16"/>
<part name="CloseDown" rect="259,8,16,16"/>
<part name="CloseHover" rect="259,226,16,16"/>
</parts>
<anchors>
<anchor name="Icon" rect="8,6,16,16"/>
<anchor name="Close" rect="-23,8,16,16"/>
<anchor name="Maximise" rect="-41,5,16,16"/>
<anchor name="Minimise" rect="-58,5,16,16"/>
</anchors>
<region>
<shape type="rectangle" rect="0,5,-1,-1"/>
<shape type="roundRect" rect="0,0,-1,-1" size="5,5" combine="or"/>
<shape type="roundRect" rect="0,0,-1,-1" size="5,5" combine="and"/>
</region>
<caption rect="28,5,400,16" fontFace="Tahoma" fontSize="11" colour="FFFFFF" inactiveColour="CCCCFF" outlineColour="000080"/>
</WindowSkin>
<WindowSkin>
<image path="SONmobileGUI.bmp"/>
<image path="DialogBK.bmp" type="watermark"/>
<target window="PopDialog"/>
<target window="Dialog"/>
<parts>
<part name="TopLeft" rect="0,0,26,26"/>
<part name="Top" rect="30,0,60,26"/>
<part name="TopRight" rect="254,247,24,26"/>
<part name="Left" rect="0,26,2,530"/>
<part name="Right" rect="280,26,2,530"/>
<part name="BottomLeft" rect="0,561,10,3"/>
<part name="Bottom" rect="10,561,60,3"/>
<part name="BottomRight" rect="272,561,10,3"/>
<part name="CloseDown" rect="259,8,16,16"/>
<part name="CloseHover" rect="259,226,16,16"/>
</parts>
<anchors>
<anchor name="Icon" rect="8,6,16,16"/>
<anchor name="Close" rect="-23,8,16,16"/>
</anchors>
<region>
<shape type="rectangle" rect="0,5,-1,-1"/>
<shape type="roundRect" rect="0,0,-1,-1" size="5,5" combine="or"/>
<shape type="roundRect" rect="0,0,-1,-1" size="5,5" combine="and"/>
</region>
<caption rect="28,5,400,16" fontFace="Tahoma" fontSize="11" colour="FFFFFF" inactiveColour="CCCCFF" outlineColour="000080"/>
</WindowSkin>
<WindowSkin>
<image path="SONmobileGUI.bmp"/>
<image path="DialogBKMakeCall.bmp" type="watermark"/>
<target window="PopDialogMakeCall"/>
<parts>
<part name="TopLeft" rect="0,0,26,26"/>
<part name="Top" rect="30,0,60,26"/>
<part name="TopRight" rect="254,247,24,26"/>
<part name="Left" rect="0,26,2,530"/>
<part name="Right" rect="280,26,2,530"/>
<part name="BottomLeft" rect="0,561,10,3"/>
<part name="Bottom" rect="10,561,60,3"/>
<part name="BottomRight" rect="272,561,10,3"/>
<part name="CloseDown" rect="259,8,16,16"/>
<part name="CloseHover" rect="259,226,16,16"/>
</parts>
<anchors>
<anchor name="Icon" rect="8,6,16,16"/>
<anchor name="Close" rect="-23,8,16,16"/>
</anchors>
<region>
<shape type="rectangle" rect="0,5,-1,-1"/>
<shape type="roundRect" rect="0,0,-1,-1" size="5,5" combine="or"/>
<shape type="roundRect" rect="0,0,-1,-1" size="5,5" combine="and"/>
</region>
<caption rect="28,5,400,16" fontFace="Tahoma" fontSize="11" colour="FFFFFF" inactiveColour="CCCCFF" outlineColour="000080"/>
</WindowSkin>
<WindowSkin>
<image path="SONmobileGUI.bmp"/>
<target window="MsgBox"/>
<parts>
<part name="TopLeft" rect="0,0,26,26"/>
<part name="Top" rect="30,0,60,26"/>
<part name="TopRight" rect="254,247,24,26"/>
<part name="Left" rect="0,26,2,530"/>
<part name="Right" rect="280,26,2,530"/>
<part name="BottomLeft" rect="0,561,10,3"/>
<part name="Bottom" rect="10,561,60,3"/>
<part name="BottomRight" rect="272,561,10,3"/>
<part name="CloseDown" rect="259,8,16,16"/>
<part name="CloseHover" rect="259,226,16,16"/>
</parts>
<anchors>
<anchor name="Icon" rect="8,6,16,16"/>
</anchors>
<region>
<shape type="rectangle" rect="0,5,-1,-1"/>
<shape type="roundRect" rect="0,0,-1,-1" size="5,5" combine="or"/>
<shape type="roundRect" rect="0,0,-1,-1" size="5,5" combine="and"/>
</region>
<caption rect="28,5,400,16" fontFace="Tahoma" fontSize="11" colour="FFFFFF" inactiveColour="CCCCFF" outlineColour="000080"/>
</WindowSkin>
</WindowSkins>
</skin>
|
|
|
|
|
Hello,
the following closing tag is not supported: />.
Best regards,
Darkoman
"Avaritia est radix omnium malorum..."
|
|
|
|
|
This is a very useful class. Thanks, good work
I would like to know how difficult to translate it to ANSI C/C++ class?
Is there are dependent must run under Windows?
|
|
|
|
|
Hello,
thanks for your interest for CXMLFile class.
No, it is not dependent in any way to MFC, .NET Framework or any other 3rd part library.
It it written in ANSI C/C++.
Best regards,
Darkoman
"Avaritia est radix omnium malorum..."
|
|
|
|
|
Actually... you may not have noticed, but you used types that are in the MFC header file.
BOOL
LPTSTR
LPBYTE
ect...
|
|
|
|
|
Hello,
yes, but it can easily be re-defined by custom types.
Regards,
Darkoman
"Avaritia est radix omnium malorum..."
|
|
|
|
|
Hi!
Your classes are still very helpful to me. But I have a doubt. Suppose I want to create and append a new element. I do this:
I find one specific element of the xml file and want to append a new element:
CXMLElement* selected_element;
CXMLElement* new_element;
LPTSTR name;
(...)
new_element->Create(name,XET_TAG);
selected_element->AppendChild(new_element);
-------------------------------------------------------------------
But just before the functions ends, the debugging it's interrupted and it shows me the Destroy method of the CXMLElement class:
Unhandled exception at 0x00415f12 in XMLTestMFC.exe: 0xC0000005: Access violation reading location 0xfeeefeee.
Why is it happening?? Thanks again for your help!
|
|
|
|
|
Hello,
can you please send me the complete body of your function (I see only a part now)?
Thank you in advance!
Regards,
Darkoman
"Avaritia est radix omnium malorum..."
|
|
|
|
|
ok, I have allready sent it.
Thanks!!!
|
|
|
|
|