Re: replace string in stream
"June Lee" wrote:
I have a function that read data byte and drmp to a file
how can I change the string <givenname xsi:nil='true'/> to
<givenname>.</givenname>
======================
bool dump;
std::ofstream dumpfile;
int my_block_reader(void *userdata, const char *buf, size_t len)
{
if (dump == false) {
if (strnicmp(buf, "<?xml", 5) == 0) {
[...]
If you need to process and transform XML files, then doing it by
hand is a dead end. You should use appropriate technology for
that. In order to reead and parse XML files use an XML parser; in
order to process XML files use and XSLT (Extensible Stylesheet
Language Transformations) engine. For example, for the following
XML file:
------- XMLFile1.xml -------
<?xml version="1.0" encoding="utf-8"?>
<root
xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
<givenname xsi:nil='true'/>
</root>
----------------------------
You could use this transform:
------- XSLTFile1.xslt -----
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
exclude-result-prefixes="msxsl"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
<xsl:output method="xml" indent="yes"/>
<xsl:template match="givenname[@xsi:nil='true']">
<xsl:copy>
<xsl:text>.</xsl:text>
</xsl:copy>
</xsl:template>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
----------------------------
Then after applying the transformation you have the output:
------- output -------
<?xml version="1.0" encoding="utf-8"?>
<root
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
<givenname>.</givenname>
</root>
----------------------
Here are some example of using MSXML with C++:
"Program with DOM in C/C++ Using Smart Pointer Class Wrappers"
http://msdn2.microsoft.com/en-us/library/ms757060(vs.85).aspx
HTH
Alex