|
Hi
I was looking for a simple c/c++ library which could validate my xml files based on the dtd (datatype definition) file
I found one XMLEditor made in Visual Basic that does this, but it uses some ActiveX component to validate the file - I want to build in this functionality in my own C++ project.
I found your XML parser, but I do not see validation, do you plan on adding this validation to your project????
|
|
|
|
|
CXMLFile xmlFile;
xmlFile.LoadFromStream((unsigned char *)info, strlen(info));
CXMLElement* pXmlRoot = xmlFile.GetRoot();
CXMLElement* pXmlElement = pXmlRoot->GetFirstChild();
LPTSTR pName = NULL;
LPTSTR val = NULL;
while(1)
{
if(!pXmlElement)
break;
pName = pXmlElement->GetElementName();
if (pXmlElement->GetElementType() == XET_TAG)
{
//pXmlRoot = pXmlElement;
pXmlElement = pXmlElement->GetFirstChild();
}
else if (pXmlElement->GetElementType() == XET_ATTRIBUTE)
{
val = pXmlElement->GetValue();
pXmlElement = pXmlRoot->GetNextChild();
}
else if (pXmlElement->GetElementType() == XET_TEXT)
{
pXmlElement = pXmlRoot->GetNextChild();//why is pXmlElement ususlly NULL?
}
}
modified on Wednesday, May 18, 2011 3:31 AM
|
|
|
|
|
this is a useful class packed by MSXML.but I found ur the class is so easy that i can`t delete&modfy a node. Thanks for share! I will try my best to update it.
|
|
|
|
|
Maybe it is better to investigate tinyXML or the similar library instead writing the new one?
Respect to darkoman, but why are you trying to discover a new wheel?
|
|
|
|
|
Hello,
this is just an example of how something can be done.
You might ask then next: why all these articles on the Code Project when you have the standard solutions?
It is not always about to "discover the wheel" but to help yourself or the others.
Or, let me put it this way: have you ever wandered how something works?
How to build your own scripting language or custom button control?
You have standard solutions here but you somehow, you always decide to do some part of the work by yourself?
Why?
Because you learn by doing it and you practice your skills also.
Regards,
Darkoman
"Avaritia est radix omnium malorum..."
|
|
|
|
|
if xml looks like:
<bala x=":)" />
Then the parser fails. If i expand it to:
<bala x=":)">babaroga</bala>
Then it succeeds. I tryed to fix it but i must say that your code is quite confusing,
using offsets instead of pointers is... ah never mind.
It is great as drop in code (although you could really handle attributes with separate
functions, this "child/type" story is a bit annoying) but from coding perspective i would rather
use something else then try to fix your code. To be fair i am giving you 3.
Srdacne pozdrave iz Slovenije...
|
|
|
|
|
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?
|
|
|
|
|