Initial import
git-svn-id: http://moon:8086/svn/software/trunk/libsrc/xerces-c-3.0.0@1 b431acfa-c32f-4a4a-93f1-934dc6c82436
This commit is contained in:
Executable
+608
@@ -0,0 +1,608 @@
|
||||
<?xml version="1.0" encoding = "iso-8859-1" standalone="no"?>
|
||||
<!--
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The ASF licenses this file to You under the Apache License, Version 2.0
|
||||
* (the "License"); you may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
-->
|
||||
|
||||
<!DOCTYPE faqs SYSTEM "sbk:/style/dtd/faqs.dtd">
|
||||
|
||||
<faqs title="Programming &XercesCName;">
|
||||
|
||||
<faq title="Does &XercesCName; support XML Schema?">
|
||||
|
||||
<q> Does &XercesCName; support Schema?</q>
|
||||
|
||||
<a>
|
||||
<p>Yes, &XercesCName; &XercesC3Version; contains an implementation
|
||||
of the W3C XML Schema Language, a recommendation of the Worldwide Web Consortium
|
||||
available in three parts:
|
||||
<jump href="http://www.w3.org/TR/xmlschema-0/">XML Schema: Primer</jump> and
|
||||
<jump href="http://www.w3.org/TR/xmlschema-1/">XML Schema: Structures</jump> and
|
||||
<jump href="http://www.w3.org/TR/xmlschema-2/">XML Schema: Datatypes</jump>.
|
||||
We consider this implementation complete. See the
|
||||
<jump href="schema-&XercesC3Series;.html#limitation">XML Schema Support</jump> page for limitations.</p>
|
||||
|
||||
</a>
|
||||
</faq>
|
||||
|
||||
<faq title="Does &XercesCName; support XPath?">
|
||||
|
||||
<q> Does &XercesCName; support XPath?</q>
|
||||
|
||||
<a>
|
||||
|
||||
<p>&XercesCName; &XercesC3Version; provides partial XPath 1 implementation
|
||||
for the purposes of handling XML Schema identity constraints.
|
||||
The same engine is made available through the DOMDocument::evaluate API to
|
||||
let the user perform simple XPath queries involving DOMElement nodes only,
|
||||
with no predicate testing and allowing the "//" operator only as the initial
|
||||
step. For full XPath 1 and 2 support refer to the
|
||||
<jump href="http://xqilla.sourceforge.net">XQilla</jump> and
|
||||
<jump href="http://xml.apache.org/xalan-c/overview.html">Apache Xalan C++</jump>
|
||||
open source projects.
|
||||
</p>
|
||||
|
||||
</a>
|
||||
</faq>
|
||||
|
||||
<faq title="Why does my application crash when instantiating the parser?">
|
||||
|
||||
<q>Why does my application crash when instantiating the parser?</q>
|
||||
|
||||
<a>
|
||||
|
||||
<p>In order to work with the &XercesCName; parser, you have to first
|
||||
initialize the XML subsystem. The most common mistake is to forget this
|
||||
initialization. Before you make any calls to &XercesCName; APIs, you must
|
||||
call XMLPlatformUtils::Initialize(): </p>
|
||||
|
||||
<source>
|
||||
try {
|
||||
XMLPlatformUtils::Initialize();
|
||||
}
|
||||
catch (const XMLException& toCatch) {
|
||||
// Do your failure processing here
|
||||
}</source>
|
||||
|
||||
<p>This initializes the &XercesCProjectName; system and sets its internal
|
||||
variables. Note that you must include the <code>xercesc/util/PlatformUtils.hpp</code> file for this to work.</p>
|
||||
|
||||
</a>
|
||||
</faq>
|
||||
|
||||
<faq title="Is it OK to call the XMLPlatformUtils::Initialize/Terminate pair of routines multiple times in one program?">
|
||||
<q>Is it OK to call the XMLPlatformUtils::Initialize/Terminate pair of routines multiple times in one program?</q>
|
||||
<a>
|
||||
<p>Yes. Note, however, that the application needs to guarantee that the
|
||||
XMLPlatformUtils::Initialize() and XMLPlatformUtils::Terminate()
|
||||
methods are called from the same thread (usually the initial
|
||||
thread executing main()) or proper synchronization is performed
|
||||
by the application if multiple threads call
|
||||
XMLPlatformUtils::Initialize() and XMLPlatformUtils::Terminate()
|
||||
concurrently.</p>
|
||||
|
||||
<p>If you are calling XMLPlatformUtils::Initialize() a number of times, and then follow with
|
||||
XMLPlatformUtils::Terminate() the same number of times, only the first XMLPlatformUtils::Initialize()
|
||||
will do the initialization, and only the last XMLPlatformUtils::Terminate() will clean up
|
||||
the memory. The other calls are ignored.
|
||||
</p>
|
||||
</a>
|
||||
</faq>
|
||||
|
||||
<faq title="Why does my application crash after calling XMLPlatformUtils::Terminate()?">
|
||||
|
||||
<q>Why does my application crash after calling XMLPlatformUtils::Terminate()?</q>
|
||||
|
||||
<a>
|
||||
|
||||
<p>Please make sure the XMLPlatformUtils::Terminate() is the last &XercesCName; function to be called
|
||||
in your program. NO explicit nor implicit &XercesCName; destructor (those local data that are
|
||||
destructed when going out of scope) should be called after XMLPlatformUtils::Terminate().
|
||||
</p>
|
||||
<p>
|
||||
For example consider the following code snippet which is incorrect:
|
||||
</p>
|
||||
|
||||
<source>
|
||||
1: {
|
||||
2: XMLPlatformUtils::Initialize();
|
||||
3: XercesDOMParser parser;
|
||||
4: XMLPlatformUtils::Terminate();
|
||||
5: }
|
||||
</source>
|
||||
|
||||
<p>The XercesDOMParser object "parser" is destructed when going out of scope at line 5 before the closing
|
||||
brace. As a result, XercesDOMParser destructor is called at line 5 after
|
||||
XMLPlatformUtils::Terminate() which is incorrect. Correct code should be:
|
||||
</p>
|
||||
|
||||
<source>
|
||||
1: {
|
||||
2: XMLPlatformUtils::Initialize();
|
||||
2a: {
|
||||
3: XercesDOMParser parser;
|
||||
3a: }
|
||||
4: XMLPlatformUtils::Terminate();
|
||||
5: }
|
||||
</source>
|
||||
|
||||
<p>The extra pair of braces (line 2a and 3a) ensures that all implicit destructors are called
|
||||
before terminating &XercesCName;.</p>
|
||||
|
||||
<p>Note also that the application needs to guarantee that the
|
||||
XMLPlatformUtils::Initialize() and XMLPlatformUtils::Terminate()
|
||||
methods are called from the same thread (usually the initial
|
||||
thread executing main()) or proper synchronization is performed
|
||||
by the application if multiple threads call
|
||||
XMLPlatformUtils::Initialize() and XMLPlatformUtils::Terminate()
|
||||
concurrently.</p>
|
||||
|
||||
</a>
|
||||
</faq>
|
||||
|
||||
<faq title="Is &XercesCName; thread-safe?">
|
||||
|
||||
<q>Is &XercesCName; thread-safe?</q>
|
||||
|
||||
<a>
|
||||
<p>The answer is yes if you observe the following rules for using
|
||||
&XercesCName; in a multi-threaded environment:</p>
|
||||
|
||||
<p>Within an address space, an instance of the parser may be used without
|
||||
restriction from a single thread, or an instance of the parser can be accessed
|
||||
from multiple threads, provided the application guarantees that only one thread
|
||||
has entered a method of the parser at any one time.</p>
|
||||
|
||||
<p>When two or more parser instances exist in a process, the instances can
|
||||
be used concurrently, without external synchronization. That is, in an
|
||||
application containing two parsers and two threads, one parser can be running
|
||||
within the first thread concurrently with the second parser running within the
|
||||
second thread.</p>
|
||||
|
||||
<p>The same rules apply to &XercesCName; DOM documents. Multiple document
|
||||
instances may be concurrently accessed from different threads, but any given
|
||||
document instance can only be accessed by one thread at a time.</p>
|
||||
|
||||
<p>The application also needs to guarantee that the
|
||||
XMLPlatformUtils::Initialize() and XMLPlatformUtils::Terminate()
|
||||
methods are called from the same thread (usually the initial
|
||||
thread executing main()) or proper synchronization is performed
|
||||
by the application if multiple threads call
|
||||
XMLPlatformUtils::Initialize() and XMLPlatformUtils::Terminate()
|
||||
concurrently.</p>
|
||||
</a>
|
||||
</faq>
|
||||
|
||||
<faq title="I am seeing memory leaks in &XercesCName;. Are they real?">
|
||||
|
||||
<q>I am seeing memory leaks in &XercesCName;. Are they real?</q>
|
||||
|
||||
<a>
|
||||
|
||||
<p>The &XercesCName; library allocates and caches some commonly reused
|
||||
items. The storage for these may be reported as memory leaks by some heap
|
||||
analysis tools; to avoid the problem, call the function <code>XMLPlatformUtils::Terminate()</code> before your application exits. This will free all memory that was being
|
||||
held by the library.</p>
|
||||
|
||||
<p>For most applications, the use of <code>Terminate()</code> is optional. The system will recover all memory when the application
|
||||
process shuts down. The exception to this is the use of &XercesCName; from DLLs
|
||||
that will be repeatedly loaded and unloaded from within the same process. To
|
||||
avoid memory leaks with this kind of use, <code>Terminate()</code> must be called before unloading the &XercesCName; library</p>
|
||||
|
||||
<p>To ensure all the memory held by the parser are freed, the number of XMLPlatformUtils::Terminate() calls
|
||||
should match the number of XMLPlatformUtils::Initialize() calls.
|
||||
</p>
|
||||
|
||||
<p>If you have built &XercesCName; with dependency on ICU then you may
|
||||
want to call the u_cleanup() ICU function to clean up
|
||||
ICU static data. Refer to the ICU documentation for details.
|
||||
</p>
|
||||
</a>
|
||||
</faq>
|
||||
|
||||
<faq title="Can &XercesCName; create an XML skeleton based on a DTD">
|
||||
|
||||
<q>Is there a function that creates an XML file from a DTD (obviously
|
||||
with the values missing, a skeleton)?</q>
|
||||
<a>
|
||||
|
||||
<p>No, there is no such functionality.</p>
|
||||
|
||||
</a>
|
||||
</faq>
|
||||
|
||||
<faq title="Can I use &XercesCName; to perform write validation">
|
||||
|
||||
<q>Can I use &XercesCName; to perform "write validation"? That is, having an
|
||||
appropriate Grammar and being able to add elements to the DOM whilst validating
|
||||
against the grammar?</q>
|
||||
|
||||
<a>
|
||||
|
||||
<p>No, there is no such functionality.</p>
|
||||
|
||||
<p>The best you can do for now is to create the DOM document, write it back
|
||||
as XML and re-parse it with validation turned on.</p>
|
||||
|
||||
</a>
|
||||
</faq>
|
||||
|
||||
<faq title="Can I validate the data contained in a DOM tree?">
|
||||
|
||||
<q>Is there a facility in &XercesCName; to validate the data contained in a
|
||||
DOM tree? That is, without saving and re-parsing the source document?</q>
|
||||
|
||||
<a>
|
||||
<p>No, there is no such functionality. The best you can do for now is to create the DOM document, write it back
|
||||
as XML and re-parse it with validation turned on.</p>
|
||||
|
||||
</a>
|
||||
</faq>
|
||||
|
||||
<faq title="How to write out a DOM tree into a string or an XML file?">
|
||||
<q>How to write out a DOM tree into a string or an XML file?</q>
|
||||
<a>
|
||||
<p>You can use
|
||||
the DOMLSSerializer::writeToString, or DOMLSSerializer::writeNode to serialize a DOM tree.
|
||||
Please refer to the sample DOMPrint or the API documentation for more details of
|
||||
DOMLSSerializer.</p>
|
||||
</a>
|
||||
</faq>
|
||||
|
||||
<faq title="Why doesn't DOMNode::cloneNode() clone the pointer assigned to a DOMNode via DOMNode::setUserData()?">
|
||||
<q>Why doesn't DOMNode::cloneNode() clone the pointer assigned to a DOMNode via DOMNode::setUserData()?</q>
|
||||
<a>
|
||||
<p>&XercesCName; supports the DOMNode::userData specified
|
||||
in <jump href="http://www.w3.org/TR/2004/REC-DOM-Level-3-Core-20040407/core.html#ID-3A0ED0A4">
|
||||
the DOM level 3 Node interface</jump>. As
|
||||
is made clear in the description of the behavior of
|
||||
<code>cloneNode()</code>, userData that has been set on the
|
||||
Node is not cloned. Thus, if the userData is to be copied
|
||||
to the new Node, this copy must be effected manually.
|
||||
Note further that the operation of <code>importNode()</code>
|
||||
is specified similarly.
|
||||
</p>
|
||||
</a>
|
||||
</faq>
|
||||
|
||||
<faq title="How are entity reference nodes handled in DOM?">
|
||||
|
||||
<q>How are entity reference nodes handled in DOM?</q>
|
||||
|
||||
<a>
|
||||
|
||||
<p>If you are using the native DOM classes, the function <code>setCreateEntityReferenceNodes</code>
|
||||
controls how entities appear in the DOM tree. When
|
||||
setCreateEntityReferenceNodes is set to true (the default), an occurrence of an
|
||||
entity reference in the XML document will be represented by a subtree with an
|
||||
EntityReference node at the root whose children represent the entity expansion.
|
||||
Entity expansion will be a DOM tree representing the structure of the entity
|
||||
expansion, not a text node containing the entity expansion as text.</p>
|
||||
|
||||
<p>If setCreateEntityReferenceNodes is false, an entity reference in the XML
|
||||
document is represented by only the nodes that represent the entity expansion.
|
||||
The DOM tree will not contain any entityReference nodes.</p>
|
||||
|
||||
</a>
|
||||
</faq>
|
||||
|
||||
<faq title="Can I use &XercesCName; to parse HTML?">
|
||||
|
||||
<q>Can I use &XercesCName; to parse HTML?</q>
|
||||
|
||||
<a>
|
||||
|
||||
<p>Yes, but only if the HTML follows the rules given in the
|
||||
<jump href="http://www.w3.org/TR/REC-xml">XML specification</jump>. Most HTML,
|
||||
however, does not follow the XML rules, and will generate XML well-formedness
|
||||
errors.</p>
|
||||
|
||||
</a>
|
||||
</faq>
|
||||
|
||||
<faq title="I keep getting an error: "invalid UTF-8 character". What's wrong?">
|
||||
|
||||
<q>I keep getting an error: "invalid UTF-8 character". What's wrong?</q>
|
||||
|
||||
<a>
|
||||
|
||||
<p>Most commonly, the XML <code>encoding =</code> declaration is either incorrect or missing. Without a declaration, XML
|
||||
defaults to the use utf-8 character encoding, which is not compatible with the
|
||||
default text file encoding on most systems.</p>
|
||||
|
||||
<p>The XML declaration should look something like this:</p>
|
||||
|
||||
<p><code><?xml version="1.0" encoding="iso-8859-1"?></code></p>
|
||||
|
||||
<p>Make sure to specify the encoding that is actually used by file. The
|
||||
encoding for "plain" text files depends both on the operating system and the
|
||||
locale (country and language) in use.</p>
|
||||
|
||||
<p>Another common source of problems is characters that are not
|
||||
allowed in XML documents, according to the XML spec. Typical disallowed
|
||||
characters are control characters, even if you escape them using the Character
|
||||
Reference form. See the XML specification, sections 2.2 and 4.1 for details.
|
||||
If the parser is generating an <code>Invalid character (Unicode: 0x???)</code> error, it is very likely that there's a character in there that you
|
||||
can't see. You can generally use a UNIX command like "od -hc" to find it.</p>
|
||||
|
||||
</a>
|
||||
</faq>
|
||||
|
||||
<faq title="What encodings are supported by &XercesCName;?">
|
||||
|
||||
<q>What encodings are supported by &XercesCName;?</q>
|
||||
|
||||
<a>
|
||||
<p>&XercesCName; has intrinsic support for ASCII, UTF-8, UTF-16 (Big/Small
|
||||
Endian), UCS4 (Big/Small Endian), EBCDIC code pages IBM037, IBM1047 and IBM1140
|
||||
encodings, ISO-8859-1 (aka Latin1) and Windows-1252. This means that it can
|
||||
always parse input XML files in these above mentioned encodings.</p>
|
||||
|
||||
<p>Furthermore, if you build &XercesCName; with the International Components
|
||||
for Unicode (ICU) as a transcoder then the list of supported encodings
|
||||
extends to over 100 different encodings that are supported by
|
||||
ICU. In particular, all the encodings registered with the
|
||||
Internet Assigned Numbers Authority (IANA) are supported
|
||||
in this configuration.</p>
|
||||
</a>
|
||||
</faq>
|
||||
|
||||
<faq title="What character encoding should I use when creating XML documents?">
|
||||
|
||||
<q>What character encoding should I use when creating XML documents?</q>
|
||||
|
||||
<a>
|
||||
|
||||
<p>The best choice in most cases is either utf-8 or utf-16. Advantages of
|
||||
these encodings include:</p>
|
||||
|
||||
<ul>
|
||||
<li>The best portability. These encodings are more widely supported by
|
||||
XML processors than any others, meaning that your documents will have the best
|
||||
possible chance of being read correctly, no matter where they end up.</li>
|
||||
<li>Full international character support. Both utf-8 and utf-16 cover the
|
||||
full Unicode character set, which includes all of the characters from all major
|
||||
national, international and industry character sets.</li>
|
||||
<li>Efficient. utf-8 has the smaller storage requirements for documents
|
||||
that are primarily composed of characters from the Latin alphabet. utf-16 is
|
||||
more efficient for encoding Asian languages. But both encodings cover all
|
||||
languages without loss.</li>
|
||||
</ul>
|
||||
|
||||
<p>The only drawback of utf-8 or utf-16 is that they are not the native
|
||||
text file format for most systems, meaning that some text file editors
|
||||
and viewers can not be directly used.</p>
|
||||
|
||||
<p>A second choice of encoding would be any of the others listed in the
|
||||
table above. This works best when the xml encoding is the same as the default
|
||||
system encoding on the machine where the XML document is being prepared,
|
||||
because the document will then display correctly as a plain text file. For UNIX
|
||||
systems in countries speaking Western European languages, the encoding will
|
||||
usually be iso-8859-1.</p>
|
||||
|
||||
<p>A word of caution for Windows users: The default character set on
|
||||
Windows systems is windows-1252, not iso-8859-1. While &XercesCName; does
|
||||
recognize this Windows encoding, it is a poor choice for portable XML data
|
||||
because it is not widely recognized by other XML processing tools. If you are
|
||||
using a Windows-based editing tool to generate XML, check which character set
|
||||
it generates, and make sure that the resulting XML specifies the correct name
|
||||
in the <code>encoding="..."</code> declaration.</p>
|
||||
|
||||
</a>
|
||||
</faq>
|
||||
|
||||
<faq title="Why does deleting a transcoded string result in assertion on windows?">
|
||||
<q>Why does deleting a transcoded string result in assertion on windows?</q>
|
||||
<a>
|
||||
<p>Both your application program and the &XercesCName; DLL must use the same DLL version of the
|
||||
runtime library. If either statically links to the runtime library, this
|
||||
problem will still occur.</p>
|
||||
|
||||
<p>For a Visual Studio build the runtime library setting MUST
|
||||
be "Multithreaded DLL" for release builds and "Debug Multithreaded DLL" for
|
||||
debug builds.</p>
|
||||
|
||||
<p>To bypass such problem, instead of calling operator delete[] directly, you can use the
|
||||
provided function XMLString::release to delete any string that was allocated by the parser.
|
||||
This will ensure the string is allocated and deleted by the same DLL and such assertion
|
||||
problem should be resolved.</p>
|
||||
</a>
|
||||
</faq>
|
||||
|
||||
<faq title="How do I transcode to/from something besides the local code page?">
|
||||
<q>How do I transcode to/from something besides the local code page?</q>
|
||||
<a>
|
||||
<p>XMLString::transcode() will transcode from XMLCh to the local code page, and
|
||||
other APIs which take a char* assume that the source text is in the local
|
||||
code page. If this is not true, you must transcode the text yourself. You
|
||||
can do this using local transcoding support on your OS, such as Iconv on
|
||||
Unix or IBM's ICU package. However, if your transcoding needs are simple,
|
||||
you can achieve better portability by using the &XercesCName; parser's
|
||||
transcoder wrappers. You get a transcoder like this:
|
||||
</p>
|
||||
<ul>
|
||||
<li>
|
||||
Call XMLPlatformUtils::fgTransServer->MakeNewTranscoderFor() and provide
|
||||
the name of the encoding you wish to create a transcoder for. This will
|
||||
return a transcoder to you, which you own and must delete when you are
|
||||
through with it.
|
||||
|
||||
NOTE: You must provide a maximum block size that you will pass to the transcoder
|
||||
at one time, and you must pass blocks of characters of this count or smaller when
|
||||
you do your transcoding. The reason for this is that this is really an
|
||||
internal API and is used by the parser itself to do transcoding. The parser
|
||||
always does transcoding in known block sizes, and this allows transcoders to
|
||||
be much more efficient for internal use since it knows the max size it will
|
||||
ever have to deal with and can set itself up for that internally. In
|
||||
general, you should stick to block sizes in the 4 to 64K range.
|
||||
</li>
|
||||
<li>
|
||||
The returned transcoder is something derived from XMLTranscoder, so they
|
||||
are all returned to you via that interface.
|
||||
</li>
|
||||
<li>
|
||||
This object is really just a wrapper around the underlying transcoding
|
||||
system actually in use by your version of &XercesCName;, and does whatever is
|
||||
necessary to handle differences between the XMLCh representation and the
|
||||
representation used by that underlying transcoding system.
|
||||
</li>
|
||||
<li>
|
||||
The transcoder object has two primary APIs, transcodeFrom() and
|
||||
transcodeTo(). These transcode between the XMLCh format and the encoding you
|
||||
indicated.
|
||||
</li>
|
||||
<li>
|
||||
These APIs will transcode as much of the source data as will fit into the
|
||||
outgoing buffer you provide. They will tell you how much of the source they
|
||||
ate and how much of the target they filled. You can use this information to
|
||||
continue the process until all source is consumed.
|
||||
</li>
|
||||
<li>
|
||||
char* data is always dealt with in terms of bytes, and XMLCh data is
|
||||
always dealt with in terms of characters. Don't mix up which you are dealing
|
||||
with or you will not get the correct results, since many encodings don't
|
||||
have a one to one relationship of characters to bytes.
|
||||
</li>
|
||||
<li>
|
||||
When transcoding from XMLCh to the target encoding, the transcodeTo()
|
||||
method provides an 'unrepresentable flag' parameter, which tells the
|
||||
transcoder how to deal with an XMLCh code point that cannot be converted
|
||||
legally to the target encoding, which can easily happen since XMLCh is
|
||||
Unicode and can represent thousands of code points. The options are to use a
|
||||
default replacement character (which the underlying transcoding service will
|
||||
choose, and which is guaranteed to be legal for the target encoding), or to
|
||||
throw an exception.
|
||||
</li>
|
||||
</ul>
|
||||
<p>Here is an example:</p>
|
||||
<source>
|
||||
// Create an XMLTranscoder that is able to transcode between
|
||||
// Unicode and UTF-8.
|
||||
//
|
||||
XMLTranscoder* t = XMLPlatformUtils::fgTransService->makeNewTranscoderFor(
|
||||
"UTF-8", failReason, 16*1024);
|
||||
|
||||
// Source string is in Unicode, want to transcode to UTF-8
|
||||
t->transcodeTo(source_unicode,
|
||||
length,
|
||||
result_utf8,
|
||||
length,
|
||||
charsEaten,
|
||||
XMLTranscoder::UnRep_Throw);
|
||||
|
||||
// Source string in UTF-8, want to transcode to Unicode.
|
||||
t->transcodeFrom(source_utf8,
|
||||
length,
|
||||
result_unicode,
|
||||
length,
|
||||
bytesEaten,
|
||||
(unsigned char*)charSz);
|
||||
</source>
|
||||
|
||||
<p>An even simpler way to transcode to a different encoding is
|
||||
to use the TranscodeToStr and TranscodeFromStr wrapper classes
|
||||
which represent a one-time transcoding and encapsulate all the
|
||||
memory management. Refer to the API Reference for more information.</p>
|
||||
</a>
|
||||
</faq>
|
||||
|
||||
<faq title="Why does the parser still try to locate the DTD even validation is turned off
|
||||
and how to ignore external DTD reference?">
|
||||
|
||||
<q>Why does the parser still try to locate the DTD even validation is turned off
|
||||
and how to ignore external DTD reference?</q>
|
||||
|
||||
<a>
|
||||
|
||||
<p>When DTD is referenced, the parser will try to read it, because DTDs can
|
||||
provide a lot more information than just validation. It defines entities and
|
||||
notations, external unparsed entities, default attributes, character
|
||||
entities, etc. Therefore the parser will always try to read it if present, even if
|
||||
validation is turned off.
|
||||
</p>
|
||||
|
||||
<p>To ignore external DTDs completely you can call
|
||||
<code>setLoadExternalDTD(false)</code> (or
|
||||
<code>setFeature(XMLUni::fgXercesLoadExternalDTD, false)</code>
|
||||
to disable the loading of external DTD. The parser will then ignore
|
||||
any external DTD completely if the validationScheme is set to Val_Never.
|
||||
</p>
|
||||
|
||||
<p>Note: This flag is ignored if the validationScheme is set to Val_Always or Val_Auto.
|
||||
</p>
|
||||
</a>
|
||||
</faq>
|
||||
|
||||
<faq title="Why does the XML data generated by the DOMLSSerializer does not match my original XML input?">
|
||||
|
||||
<q>Why does the XML data generated by the DOMLSSerializer does not match my original XML input?</q>
|
||||
|
||||
<a>
|
||||
|
||||
<p>If you parse an xml document using XercesDOMParser or DOMLSParser and pass such DOMNode
|
||||
to DOMLSSerializer for serialization, you may not get something that is exactly the same
|
||||
as the original XML data. The parser may have done normalization, end of line conversion,
|
||||
or has expanded the entity reference as per the XML 1.0 specification, 4.4 XML Processor Treatment of
|
||||
Entities and References. From DOMLSSerializer perspective, it does not know what the original
|
||||
string was, all it sees is a processed DOMNode generated by the parser.
|
||||
But since the DOMLSSerializer is supposed to generate something that is parsable if sent
|
||||
back to the parser, it will not print the DOMNode node value as is. The DOMLSSerializer
|
||||
may do some "touch up" to the output data for it to be parsable.</p>
|
||||
|
||||
<p>See <jump href="program-dom-&XercesC3Series;.html#DOMLSSerializerEntityRef">How does DOMLSSerializer handle built-in entity
|
||||
Reference in node value?</jump> to understand further how DOMLSSerializer touches up the entity reference.
|
||||
</p>
|
||||
</a>
|
||||
</faq>
|
||||
|
||||
<faq title="Why does my application crash when deleting the parser after releasing a document?">
|
||||
|
||||
<q>Why does my application crash when deleting the parser after releasing a document?</q>
|
||||
|
||||
<a>
|
||||
|
||||
<p>In most cases, the parser handles deleting documents when the parser gets deleted. However, if an application
|
||||
needs to release a document, it shall adopt the document before releasing it, so that the parser
|
||||
knows that the ownership of this particular document is transfered to the application and will not
|
||||
try to delete it once the parser gets deleted.
|
||||
</p>
|
||||
|
||||
<source>
|
||||
XercesDOMParser *parser = new XercesDOMParser;
|
||||
...
|
||||
try
|
||||
{
|
||||
parser->parse(xml_file);
|
||||
}
|
||||
catch ()
|
||||
{
|
||||
...
|
||||
}
|
||||
DOMNode *doc = parser->getDocument();
|
||||
...
|
||||
parser->adoptDocument();
|
||||
doc->release();
|
||||
...
|
||||
delete parser;
|
||||
</source>
|
||||
|
||||
<p>The alternative to release document is to call parser's resetDocumentPool(), which releases
|
||||
all the documents parsed.
|
||||
</p>
|
||||
|
||||
</a>
|
||||
</faq>
|
||||
|
||||
</faqs>
|
||||
Reference in New Issue
Block a user