??xml version="1.0" encoding="utf-8" standalone="yes"?>91精品国产高清久久久久久国产嫩草,99精品国产综合久久久久五月天,国产精品日韩欧美久久综合http://www.shnenglu.com/cannysyma/用心(j)Q?/description>zh-cnWed, 02 Jul 2025 18:31:27 GMTWed, 02 Jul 2025 18:31:27 GMT60用于本机 C++ 的小巧快L(fng) XML 分析?/title><link>http://www.shnenglu.com/cannysyma/archive/2007/03/31/21006.html</link><dc:creator>Canny</dc:creator><author>Canny</author><pubDate>Sat, 31 Mar 2007 08:50:00 GMT</pubDate><guid>http://www.shnenglu.com/cannysyma/archive/2007/03/31/21006.html</guid><wfw:comment>http://www.shnenglu.com/cannysyma/comments/21006.html</wfw:comment><comments>http://www.shnenglu.com/cannysyma/archive/2007/03/31/21006.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.shnenglu.com/cannysyma/comments/commentRss/21006.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/cannysyma/services/trackbacks/21006.html</trackback:ping><description><![CDATA[ <div id="iseoqkq" class="dropcap">原文地址Q?a >http://msdn.microsoft.com/msdnmag/issues/07/04/Xml/Default.aspx?loc=zh</a><br /><br />    管 .NET Framework 不断取得成功QMicrosoft 仍然认真对待本机 C++ 开发。通过引入 XmlLiteQ适合于用本机 C++ ~写的应用程序的高性能、低开销 XML d器和写入器)(j)说明?jin)这一炏V?</div> <p> </p> <p xmlid="PARA002">托管代码通过 System.Xml 命名I间q泛支持 XMLQ而依赖于 COM 的传l?Visual Basic<sup class="clsSmall">]</sup> ?C++ 应用E序可以讉K Microsoft<sup class="clsSmall">]</sup> XML 核心(j)服务 (MSXML) 中的cM功能。但是,q些q没有ؓ(f)需要快速精?XML 分析器的本机 C++ 开发h员提供富有吸引力的选项。开始?XmlLite 吧?/p> <p xmlid="PARA003">本文探讨?zhn)可以?XmlLite 执行的操作。但是,首先Qؓ(f)讑֮预期Q我希望快速回一?XmlLite 未提供的内容Q至是此初始版本中未提供的内容。对于初学者,它既未提供文档对象模?(DOM) 实现Q也未提?XML 架构或文档类型定?(DTD) 验证。它q缺对高工具的支持,例如Z光标的导航(?XPathQ、样式表和序列化。但是,通过建立?XmlLite 之上的功能,可以Ҏ(gu)需要填补Q何空白,Microsoft .NET Framework 中的几乎所?XML 功能同样都徏立在 XmlReader ?XmlWriter cM上?/p> <p xmlid="PARA004">那么QXmlLite 提供?jin)哪些内容?单地_(d)它提供了(jin)非缓存的只进分析器(提供接收式编E模型)(j)和非~存的只q?XML 生成器。已证明q两者是非常有h(hun)值的功能?/p> <br /> <a name="S1"> </a> <span id="gomcooy" class="clsSubhead">Z么推出新?XML 分析器?</span> <br /> <p xmlid="PARA005">开发h员日益熟(zhn)他们每天用的库,通过q泛使用 XMLQ他们肯定会(x)询问有关新推出的 XML 分析器的一些疑N题。要?jin)解q一新分析器的h(hun)|让我们首先考虑一?XML 分析器当今的情Ş?/p> <p xmlid="PARA006">很自然地Q如果应用程序已l利?.NET FrameworkQ则军_通常是很单的Q只需使用 System.Xml 卛_。ؓ(f)证明q一点,XmlLite 的设计基?.NET Framework ?XmlReader ?XmlWriter cȝ设计。从?C++ ~写的托应用程序?XmlLite 通常没有优势。XmlLite 的功能毕竟比 XmlReader ?XmlWriter cL供的功能要少得多。(<a class="clsFigs" onclick="OpenUrl('default.aspx?loc=zh/&fig=true#fig1'); return false;" target="_self" xmlns:user="http://msdn.microsoft.com">图?</a> 中的表略q?XmlLite 中的主要cd如何映射?.NET Framework 中的主要cd。)(j)另一斚wQ如果应用程序仅使用本机代码Q那么就 Microsoft 技术而言QMSXML 在传l上是所选的解决Ҏ(gu)?/p> <p xmlid="PARA007">MSXML 提供?jin)两个差异很大?XML 分析器。第一个分析器是在各种情Ş下可用的 DOM 实现。如果用较?yu)?XML 文且需要随?XML 文q行内存中读取和写入Q则 DOM 实现是一U合理的选择。MSXML 的更高版本引入了(jin)“用?XML 的简?API (SAX2)”的实现。它实际上是否简单是有争议的。?SAX2 Ӟ甚至在开始之前)(j)Q?zhn)需要实现至两?COM 接口Q一个用于接?XML 文档中各个节点的通知Q另一个用于接收分析错误的通知?/p> <p xmlid="PARA008">?SAX2 实现d?MSXML 的原因如下:(x)?DOM 实现不同QSAX2 分析器以数据Ş式读?XML 文Qƈ通知(zhn)何时到辑֐个节炏V这意味着Q?zhn)的应用程序的内存使用量ƈ不随所分析文档的大而增加?/p> <p xmlid="PARA009">SAX2 存在的问题以?.NET Framework 不提供其实现的原因在?SAX2 模型的内在复杂性。它要求实现接口或事Ӟq强制开发h员用更为间接的~程模型Q要求开发h员管理注定会(x)使应用程序变得复杂的其他状态。相反,.NET Framework 中的 XmlReader ?XmlWriter cM?XmlLite ?IXmlReader ?IXmlWriter 接口提供?jin)简单易懂的分析器,可以直接在函C使用Q而不必管理Q何外部状态或通知?/p> <p xmlid="PARA010">׃其设计的明性,XmlLite 能够提供相当好的性能Q即使与 MSXML SAX2 实现相比也是如此。虽?SAX2 分析器可以比 DOM 实现更好地处理大型文,但是?XmlLite 相比逊色?jin)?/p> <p xmlid="PARA011">单地_(d)XmlLite 优于 MSXMLQ且它更易于从本?C++ 使用。MSXML 仍将?Visual Basic 和基?COM 的脚本语a的最可行解决Ҏ(gu)Q但是现在本?Visual C++<sup class="clsSmall">]</sup> 最l具有了(jin)专门为它设计?XML 分析器。虽?Windows Vista?和更高版本中附带?XmlLiteQ但是一个更新对?Windows<sup class="clsSmall">]</sup> XP ?Windows Server<sup class="clsSmall">]</sup> 2003 ?32 位和 64 位版本也是可用的。因为未涉及(qing) COM 注册Q所以此更新包应该不?x)导?MSXML 通常造成的有兛_装和版本控制的难题?/p> <div style="MARGIN-TOP: 5px" align="right"> <a class="clsSmall" onclick="OpenMenu(contentbtn, contentmenu);" target="_self"> <img style="MARGIN-LEFT: 5px" height="8" alt="Back to top" src="http://msdn.microsoft.com/msdnmag/images/top.gif" width="18" align="bottom" border="0" /> </a> </div> <br /> <a name="S2"> </a> <span id="cwmicmc" class="clsSubhead">COM“Lite?/span> <br /> <p xmlid="PARA012">XmlLite 不仅是易记的名称Q事实上Q它是一个轻?XML 分析器。XmlLite 利用?COM 的精华,即编E规范和U定Qƈ抛弃?jin)复杂的和可能不必要的部分,?COM 注册、运行时服务、代理、线E模型、封送处理等?/p> <p xmlid="PARA013">?XmlLite.dll 导出的函数创?XML d器和写入器。通过链接?XmlLite.lib q包?Windows SDK 中的 XmlLite.h 头文Ӟ可以讉K它们。生成的 COM 样式接口使用熟?zhn)?IUnknown 接口Ҏ(gu)q行生存期管理。COM IStream 接口也vC定作用ƈ表示存储器。除此之外,没有 COM 的依赖项Q无需注册M COM cL甚至调用强制性的 CoInitialize 函数。活动模板库 (ATL) CComPtr cd理剩余的一部?COM。但是,(zhn)确实需要关注线E安全,因ؓ(f)Z单线E方案中的性能QXmlLite 不是U程安全的?/p> <p xmlid="PARA014">我在以下CZ中?COM_VERIFY 宏,以便清晰地识别方法在何处q回需要检查的 HRESULT。可以将此替换ؓ(f)相应的错误处?- 不管该操作引发异常还是?zhn)自己q回 HRESULT?/p> <div style="MARGIN-TOP: 5px" align="right"> <a class="clsSmall" onclick="OpenMenu(contentbtn, contentmenu);" target="_self"> <img style="MARGIN-LEFT: 5px" height="8" alt="Back to top" src="http://msdn.microsoft.com/msdnmag/images/top.gif" width="18" align="bottom" border="0" /> </a> </div> <br /> <a name="S3"> </a> <span id="qoeyqyw" class="clsSubhead">d XML</span> <br /> <p xmlid="PARA015">XmlLite 提供?jin)返?IXmlReader 接口实现?CreateXmlReader 函数Q?</p> <pre class="clsCode">CComPtr<IXmlReader> reader; COM_VERIFY(::CreateXmlReader(__uuidof(IXmlReader), reinterpret_cast<void**>(&reader), 0)); </pre> <p> </p> <p xmlid="PARA016">虽然是可选的Q但?CComPtr cL板确保迅速释放接口指针?/p> <p xmlid="PARA017">CreateXmlReader 接受接口标识W?(IID) 以及(qing)指向 void 指针的指针。这?COM ~程中的常见模式Q允许调用方指定要返回的接口指针的类型。我的示例?__uuidof q算W,该运符?Microsoft 特定的关键字Q用于提取与cd兌?GUID。在q种情况下,它用于检索接口的 IID。CreateXmlReader 的最后一个参数接受可选的 IMalloc 实现以允许调用方控制内存分配?/p> <p xmlid="PARA018">创徏d器后Q需要指C取器用作输入的存储器。IStream 接口表示存储器,q样可以将 XmlLite 与可能设计的M实C起用:(x) </p> <pre class="clsCode">CComPtr<IStream> stream; // Create stream object here... COM_VERIFY(reader->SetInput(stream)); </pre> <p> </p> <p xmlid="PARA019">Q我在本文的后面部分中讨论。)(j)</p> <p xmlid="PARA020">讄 XML d器的输入后,可以通过重复调用 Read Ҏ(gu)q行d。Read Ҏ(gu)接受一个可选参敎ͼ该参数在每次成功调用时返回节点类型。Read Ҏ(gu)q回 S_OK 以指C已从流中成功读取下一个节点,q回 S_FALSE 以指C已到达的l尾处。以下是如何依次枚D节点的一个示例:(x) </p> <pre class="clsCode">HRESULT result = S_OK; XmlNodeType nodeType = XmlNodeType_None; while (S_OK == (result = reader->Read(&nodeType))) { // Get node-specific info } </pre> <p> </p> <p xmlid="PARA021">要枚丑ֽ前节点的属性,请?MoveToFirstAttribute ?MoveToNextAttribute Ҏ(gu)。如果已成功地重新定位读取器Q则q两U方法都q回 S_OKQ如果不存在更多的属性,则返?S_FALSE。以下示例说明如何依ơ枚丄定节点的属性:(x) </p> <pre class="clsCode">for (HRESULT result = reader->MoveToFirstAttribute(); S_OK == result; result = reader->MoveToNextAttribute()) { // Get attribute-specific info } </pre> <p> </p> <p xmlid="PARA022">调用 IXmlReader ?Read Ҏ(gu)Ӟ它会(x)Q何节点属性自动存储在内部集合中。这P(zhn)就可以使用 MoveToAttributeByName Ҏ(gu)Q按名称读取器Ud到特定的属性。但是,枚D属性ƈ其存储在应用程序特定的数据l构中,效率通常更高。请注意Q?zhn)q可以?GetAttributeCount Ҏ(gu)定当前节点中的属性数?/p> <p xmlid="PARA023">定节点或属性后Q获取其信息很单了(jin)。以下示例演C如何获取给定节点的命名I间 URI 和本地名Uͼ(x) </p> <pre class="clsCode">PCWSTR namespaceUri = 0; UINT namespaceUriLength = 0; COM_VERIFY(reader->GetNamespaceUri(&namespaceUri, &namespaceUriLength)); PCWSTR localName = 0; UINT localNameLength = 0; COM_VERIFY(reader->GetLocalName(&localName, &localNameLength)); </pre> <p> </p> <p xmlid="PARA024">q回字符串值的所?IXmlReader Ҏ(gu)都遵循此模式。第一个参数接受指向宽字符指针帔R的指针。第二个参数是可选的Q如果它不ؓ(f)Ӟ则它?yu)返回以字符度量的字W串长度Q不包括I结束符Q?/p> <p xmlid="PARA025">以下是强调性能的另一个示例。仅在将d器移动到其他节点或以某种其他方式Q如通过讄新的输入或释放 IXmlReader 接口Q当前节点无效之前Q从 IXmlReader Ҏ(gu)q回的字W串指针才是有效的。换句话_(d)IXmlReader 不会(x)流的副本返回给调用斏V?/p> <p xmlid="PARA026">与其?.NET Framework 中的对应方不同,IXmlReader 未提供读取键入内容的MҎ(gu)。例如,如果特定的元素或属性包含数字或日期Q则(zhn)需要首先获取其字符串表CŞ式,然后Ҏ(gu)需要自p行{换?NET Framework ?XmlReader cM存在的许多其?helper Ҏ(gu)也不存在?IXmlReader 中,但是可以作ؓ(f) helper 函数~写。XmlLite 实W合最接口设计的 C++ 理论?/p> <p xmlid="PARA027"> <span id="cswgkyg" class="clsFigs" xmlns:user="http://msdn.microsoft.com">图?</span> 昄使用 IXmlReader d XML 文档时涉?qing)的对象和抽象。但是,L(fng)讎ͼIStream 可以抽取M存储Q此处显C的文g仅仅是一个常见示例?/p> <div class="siceywu" id="290154002" style="DISPLAY: block; FLOAT: right; MARGIN: 5px 0px 10px 5px; WIDTH: 154px"> <img height="290" alt="?2 d? src="http://msdn.microsoft.com/msdnmag/issues/07/04/Xml/zh/fig02.gif" width="154" border="0" /> <br /> <span id="emoscii" class="clsCap">?2</span> <span id="gesmqwe" class="clsCaptxt">d?/span></div> <div style="MARGIN-TOP: 5px" align="right"> <a class="clsSmall" onclick="OpenMenu(contentbtn, contentmenu);" target="_self"> <img style="MARGIN-LEFT: 5px" height="8" alt="Back to top" src="http://msdn.microsoft.com/msdnmag/images/top.gif" width="18" align="bottom" border="0" /> </a> </div> <br /> <a name="S4"> </a> <span id="eamoage" class="clsSubhead">写入 XML</span> <br /> <p xmlid="PARA028">XmlLite 提供?jin)返?IXmlWriter 接口实现?CreateXmlWriter 函数Q?</p> <pre class="clsCode">CComPtr<IXmlWriter> writer; COM_VERIFY(::CreateXmlWriter(__uuidof(IXmlWriter), reinterpret_cast<void**>(&writer), 0)); </pre> <p> </p> <p xmlid="PARA029">创徏写入器后Q需要指C写入器用作输出的存储器:(x) </p> <pre class="clsCode">CComPtr<IStream> stream; // Create stream object here COM_VERIFY(writer->SetOutput(stream)); </pre> <p> </p> <p xmlid="PARA030">开始写入之前,可以修改写入器属性。XmlWriterProperty 枚D定义可用的属性。例如,(zhn)可能希望指定是否羃q?XML 输出以便于读者阅读(使用 SetProperty Ҏ(gu)可以做到q一点)(j)Q?</p> <pre class="clsCode">COM_VERIFY(writer->SetProperty(XmlWriterProperty_Indent, TRUE)); </pre> <p> </p> <p xmlid="PARA031">然后可以开始?IXmlWriter Ҏ(gu)写入基础。XmlLite 支持 XML 片段。如果计划写入完整的 XML 文档Q则应该从调?WriteStartDocument Ҏ(gu)Q它负责写入 XML 声明Q开始。声明取决于所用的~码Q但是默认编码ؓ(f) UTF-8Q它在大多数情况下都应该是合适的。(E后介l文本编码。)(j)提供?jin)许?WriteXxx Ҏ(gu)Q用于写入各U节点类型、属性和倹{?/p> <p xmlid="PARA032">误(g)虑以下CZQ?</p> <pre class="clsCode">COM_VERIFY(writer->WriteStartDocument(XmlStandalone_Omit)); COM_VERIFY(writer->WriteStartElement(0, L"html", L"http://www.w3.org/1999/xhtml")); COM_VERIFY(writer->WriteStartElement(0, L"head", 0)); COM_VERIFY(writer->WriteElementString(0, L"title", 0, L"My Web Page")); COM_VERIFY(writer->WriteEndElement()); // </head> COM_VERIFY(writer->WriteStartElement(0, L"body", 0)); COM_VERIFY(writer->WriteElementString(0, L"p", 0, L"Hello world!")); COM_VERIFY(writer->WriteEndDocument()); </pre> <p> </p> <p xmlid="PARA033">WriteStartDocument Ҏ(gu)处理?XML 声明写入的操作。它只有一个参敎ͼ该参数接受来?XmlStandalone 枚D的|指示是否出现独立的文声明,如果是这P则指C它保存的倹{写?XML 片段Ӟ通常省略?WriteStartDocument 的调用?/p> <p xmlid="PARA034">WriteStartElement Ҏ(gu)接受以下三个参数Q第一个参数指定元素的可选命名空间前~Q第二个参数指定元素的本地名UͼW三个参数指定可选的命名I间 URI。WriteElementString ?XmlLite 提供的非常方便的Ҏ(gu)之一。用于写?XHTML 文标题的以下代码等效于上一CZ中用的 WriteElementStringQ?</p> <pre class="clsCode">COM_VERIFY(writer->WriteStartElement(0, L"title", 0)); COM_VERIFY(writer->WriteString(L"My Web Page")); COM_VERIFY(writer->WriteEndElement()); </pre> <p> </p> <p xmlid="PARA035">昄QW(xu)riteElementString Ҏ(gu)不是l对必要的,但它实很有用?/p> <p xmlid="PARA036">最后,W(xu)riteEndDocument Ҏ(gu)用于关闭文。?zhn)可能已注意到Q未昑ּ关闭 body ?html 元素。WriteEndDocument ?x)自动关闭Q何打开的元素。就此而言Q释攑ֆ入器也会(x)关闭M剩余的元素。但是,如果(zhn)不心(j)Q则未显式关闭此cd素的做法可能?x)导致错误,因?f)的生存期和写入器的生存期通常可以不同。要说的是,如果需要确保已所有要写入的内容写入基,则只需调用 IXmlWriter ?Flush Ҏ(gu)卛_?/p> <p xmlid="PARA037"> <span id="ayuuouc" class="clsFigs" xmlns:user="http://msdn.microsoft.com">图?</span> 昄使用 IXmlWriter 写入 XML 文时涉?qing)的对象和抽象流。请牢记QIStream 可以抽取M存储Q此处的文g仅仅是一个常见示例?/p> <div class="ooyseca" id="268143004" style="DISPLAY: block; FLOAT: right; MARGIN: 5px 0px 10px 5px; WIDTH: 143px"> <img height="268" alt="?3 写入? src="http://msdn.microsoft.com/msdnmag/issues/07/04/Xml/zh/fig03.gif" width="143" border="0" /> <br /> <span id="ucwgqyg" class="clsCap">?3</span> <span id="soimwmc" class="clsCaptxt">写入?/span></div> <div style="MARGIN-TOP: 5px" align="right"> <a class="clsSmall" onclick="OpenMenu(contentbtn, contentmenu);" target="_self"> <img style="MARGIN-LEFT: 5px" height="8" alt="Back to top" src="http://msdn.microsoft.com/msdnmag/images/top.gif" width="18" align="bottom" border="0" /> </a> </div> <br /> <a name="S5"> </a> <span id="yegkeka" class="clsSubhead">使用?/span> <br /> <p xmlid="PARA038">到此为止Q我Ҏ(gu)q行的介lƈ不多。与一些功能更全面?XML 库不同,XmlLite 未提供Q何支持从公共存储位置Q如文g或通过|络协议Q读取和向其写入的功能。正因ؓ(f)q一点,对于希望从其d或向其写入的M存储器,(zhn)都需要提?IStream 实现。实?IStream 接口q不复杂Q但是在许多情况下,(zhn)不需要执行此操作Q因为实现可能已存在?/p> <p xmlid="PARA039">CreateStreamOnHGlobal 函数提供p拟内存支持的 IStream 实现。第一个参数是使用 GlobalAlloc 函数创徏的可选内存句柄。但是,只需传递零QCreateStreamOnHGlobal 卛_为?zhn)创徏内存对象。以下示例创Z个由pȝ内存支持且将Ҏ(gu)需要动态增长的 IStream 实现Q?</p> <pre class="clsCode">CComPtr<IStream> stream; COM_VERIFY(::CreateStreamOnHGlobal(0, TRUE, &stream)); </pre> <p> </p> <p xmlid="PARA040">释放将释放内存?/p> <p xmlid="PARA041">SHCreateStreamOnFile 函数提供?jin)另一个有用的 IStream 实现。它创徏由文件支持的 IStreamQ?</p> <pre class="clsCode">CComPtr<IStream> stream; COM_VERIFY(::SHCreateStreamOnFile(L"D:\\Sample.xml", STGM_WRITE | STGM_SHARE_DENY_WRITE, &stream)); </pre> <p> </p> <div style="MARGIN-TOP: 5px" align="right"> <a class="clsSmall" onclick="OpenMenu(contentbtn, contentmenu);" target="_self"> <img style="MARGIN-LEFT: 5px" height="8" alt="Back to top" src="http://msdn.microsoft.com/msdnmag/images/top.gif" width="18" align="bottom" border="0" /> </a> </div> <br /> <a name="S6"> </a> <span id="kqkeoem" class="clsSubhead">d时的文本~码</span> <br /> <p xmlid="PARA042">虽然默认情况?XmlLite 使用 UTF-8 q行写入Q但是如果在d时尝试检文本编码,则可以覆盖此行ؓ(f)。首先,让我们看一下?zhn)自动获取的信息。对于给定的,IXmlReader 通过作ؓ(f) XML 前同步码的字节顺序标记来(g)编码提C。IXmlReader q将允许?XML 声明中指定的M~码。期望Q?XML 分析器都hq两个特征。如果具有可能未定义M~码信息的输入流Q而且 XmlLite 无法试探性地定正用的~码Q则可以?IXmlReader 定向到特定的~码Q如果给定了(jin)代码|~码名称Q?/p> <p xmlid="PARA043">可以假?IXmlReaderInput 接口创徏 XML d器输入对象,而不是将直接传递到 IXmlReader。提供了(jin)两个用于创徏包装输入的输入对象的函数。CreateXmlReaderInputWithEncodingCodePage 函数接受代码늼号Ş式的代码。CreateXmlReaderInputWithEncodingName 函数接受使用其规范名U的~码。除此之外,q两个函数具有完全相同的{֐。概括一下,通常可以?XML d器的输入进行如下设|:(x) </p> <pre class="clsCode">CComPtr<IStream> stream; // Create stream object here COM_VERIFY(reader->SetInput(stream)); </pre> <p> </p> <p xmlid="PARA044">要覆盖编码,请将代码更改为:(x) </p> <pre class="clsCode">CComPtr<IStream> stream; // Create stream object here CComPtr<IXmlReaderInput> input; COM_VERIFY(::CreateXmlReaderInputWithEncodingName(stream, 0, // default allocator L"ISO-8859-8", TRUE, // hint 0, // base URI &input)); COM_VERIFY(reader->SetInput(input)); </pre> <p> </p> <p xmlid="PARA045">W一个参数指C?XML d器将从其d的流。第二个参数接受可选的 IMalloc 实现。如果提供的话,则它?yu)覆?XML d器自q实现。第三个参数指定~码名称?a >msdn2.microsoft.com/ms752827.aspx</a> 上的文档列出?jin)本机支持的~码Q要支持其他~码Q可以提?IMultiLanguage2 接口实现。下一个参数指C是否必M用指定的~码或者它是否仅仅是一个提C。如果指?TRUEQ则指示分析器尝试用徏议的~码Q但是如果它p|Q则可以随意试试探性地定实际的编码。如果指?FALSEQ则指示分析器尝试徏议的~码Q如果它与输入流不匹配,则返回错误。下一个参数接受可能用于解析外部实体的可选基?URI。最后一个参数返回表C传递到 SetInput Ҏ(gu)的输入对象的接口指针?/p> <div style="MARGIN-TOP: 5px" align="right"> <a class="clsSmall" onclick="OpenMenu(contentbtn, contentmenu);" target="_self"> <img style="MARGIN-LEFT: 5px" height="8" alt="Back to top" src="http://msdn.microsoft.com/msdnmag/images/top.gif" width="18" align="bottom" border="0" /> </a> </div> <br /> <a name="S7"> </a> <span id="qgqsucy" class="clsSubhead">写入时的文本~码</span> <br /> <p xmlid="PARA046">XML 写入器将Z传递到 SetOutput Ҏ(gu)的对象确定要使用的编码。如果该对象实现 IStream 接口或者甚臛_现有限的 ISequentialStream 接口Q则 XML 写入器将使用 UTF-8 ~码。可以创?XML 写入器输出对象来覆盖此行为。提供了(jin)两个用于创徏包装输出的输出对象的函数。CreateXmlWriterOutputWithEncodingCodePage 函数接受代码늼号Ş式的~码Q?CreateXmlWriterOutputWithEncodingName 函数接受使用其规范名U的~码。除此之外,q两个函数具有完全相同的{֐。通常Q可以对 XML 写入器的输出进行如下设|:(x) </p> <pre class="clsCode">CComPtr<IStream> stream; // Create stream object here COM_VERIFY(writer->SetOutput(stream)); </pre> <p> </p> <p xmlid="PARA047">要覆盖默认编码,L(fng)写以下代码:(x) </p> <pre class="clsCode">CComPtr<IStream> stream; // Create stream object here CComPtr<IXmlWriterOutput> output; COM_VERIFY(::CreateXmlWriterOutputWithEncodingName(stream, 0, L"ISO-8859-8", &output)); COM_VERIFY(writer->SetOutput(output)); </pre> <p> </p> <p xmlid="PARA048">W一个参数指C?XML 写入器将写入的流。第二个参数接受可选的 IMalloc 实现。如果提供的话,则它?yu)覆?XML 写入器自q实现。第三个参数指定~码名称。最后一个参数返回表C传递到 SetOutput Ҏ(gu)的输出对象的接口指针?/p> <div style="MARGIN-TOP: 5px" align="right"> <a class="clsSmall" onclick="OpenMenu(contentbtn, contentmenu);" target="_self"> <img style="MARGIN-LEFT: 5px" height="8" alt="Back to top" src="http://msdn.microsoft.com/msdnmag/images/top.gif" width="18" align="bottom" border="0" /> </a> </div> <br /> <a name="S8"> </a> <span id="qyaseci" class="clsSubhead">处理大数据?/span> <br /> <p xmlid="PARA049">Z(jin)在读取大数据值时限制内存使用QXML d器提供了(jin)按数据块d值的机制。IXmlReader ReadValueChunk Ҏ(gu)d的字W数不超q规定的最大字W数Q在预料到后l调用时向前Udd器。以下示例说明如何重复调?ReadValueChunk 以读取大数据|(x) </p> <pre class="clsCode">CString value; WCHAR chunk[256] = { 0 }; HRESULT result = S_OK; UINT charsRead = 0; while (S_OK == (result = reader->ReadValueChunk(chunk, countof(chunk), &charsRead))) { value.Append(chunk, charsRead); } </pre> <p> </p> <p xmlid="PARA050">当不再有数据可用ӞReadValueChunk q回 S_FALSE。在此示例中Q我要将数据块写?CString 对象。这仅仅是ؓ(f)?jin)说明如何管理数据块的长度,昄q在实际中会(x)抉|数据分块的优ѝ?/p> <div style="MARGIN-TOP: 5px" align="right"> <a class="clsSmall" onclick="OpenMenu(contentbtn, contentmenu);" target="_self"> <img style="MARGIN-LEFT: 5px" height="8" alt="Back to top" src="http://msdn.microsoft.com/msdnmag/images/top.gif" width="18" align="bottom" border="0" /> </a> </div> <br /> <a name="S9"> </a> <span id="iekegck" class="clsSubhead">安全注意事项</span> <br /> <p xmlid="PARA051">?XML Z?j)的应用E序必须L处理来自不可信源?XML。XmlLite 提供?jin)许多工具以保护应用E序免受已知漏洞和将来漏z的d?/p> <p xmlid="PARA052">XML 文可以包含对外部实体的引用。一?XML 分析器自动解析这些实体。虽然此Ҏ(gu)可能很有用,但是Q如果未仔细~写 XML 解析E序以缓解各U威胁,则此Ҏ(gu)可能?x)造成安全漏洞的攻凅RXmlLite 既不自动解析外部实体Q也不提?XML 解析E序。要提供自己的实玎ͼ如有必要Q,请实?IXmlResolver 接口q将 XmlReaderProperty_XmlResolver 属性与 IXmlReader SetProperty Ҏ(gu)一起用,以指C取器使用(zhn)的解析E序?/p> <p xmlid="PARA053">XML 文可能q包?DTD 处理说明。虽?XmlLite 不支持文验证(使用 XML 架构?DTDQ,但是它支?DTD 实体扩展和默认属性。由于这?DTD 可以包含对外部实体的引用Q因此它们可能会(x)使?zhn)的应用程序受到各U攻凅R默认情况下QXmlLite 用 DTD 处理。通过?XmlReaderProperty_DtdProcessing 属性设|ؓ(f) DtdProcessing_Parse |可以允许 DTD 处理。此外,q存在由 XmlReaderProperty_MaxEntityExpansion 控制?DTD 实体扩展dQ也UCؓ(f) billion laughs dQ的内置~解措施。此属性的默认gؓ(f) 100,000?/p> <p xmlid="PARA054">d者可以利用?XML 的应用程序的另一U方法是Q创建名U非帔R的文。如果未能阻止,则这可能用尽巨大的内存ƈ允许拒绝服务d。我已经提示?jin)可以执行的?gu)。缓解此cd胁的一U明显方法是Q按数据块读取大数据|如上一部分所q。另一U有用的Ҏ(gu)是,提供限制内存分配的自定义 IMalloc 实现。如果输入流支持随机讉KQ则q可以指C?XML d器?XmlReaderProperty_RandomAccess 属性来避免~存属性。这减用于读取开始元素标记的内存量,但是也可能降低分析速度Q因为分析器必须来回查找以便在请求时(g)索各个属性倹{?/p> <p xmlid="PARA055">如果 XML 层次l构q深Q则也可能快速用系l资源。要Ld者提供层ơ结构过q XML 文Q可以?XmlReaderProperty_MaxElementDepth 属性限制分析器允许的深度。此属性默认ؓ(f) 256?/p> <div style="MARGIN-TOP: 5px" align="right"> <a class="clsSmall" onclick="OpenMenu(contentbtn, contentmenu);" target="_self"> <img style="MARGIN-LEFT: 5px" height="8" alt="Back to top" src="http://msdn.microsoft.com/msdnmag/images/top.gif" width="18" align="bottom" border="0" /> </a> </div> <br /> <a name="S10"> </a> <span id="ecuyiqg" class="clsSubhead">ȝ</span> <br /> <p xmlid="PARA056">XmlLite 为本?C++ 应用E序提供?jin)功能强大?XML 分析器。它着重于性能Q知道它所使用的系l资源,为控制这些特征提供了(jin)很大的灵zL。XmlLite 支持所有的常见文本~码Q是一U非常有用的实用工具Q可以简化本?C++ 应用E序中的 XML 使用。有兌l信息,请参?<a >msdn2.microsoft.com/ms752872.aspx</a> 上的 XmlLite 文?/p> <img src ="http://www.shnenglu.com/cannysyma/aggbug/21006.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/cannysyma/" target="_blank">Canny</a> 2007-03-31 16:50 <a href="http://www.shnenglu.com/cannysyma/archive/2007/03/31/21006.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++ 学习(fn)W记 ?数据cd1http://www.shnenglu.com/cannysyma/archive/2007/03/17/20029.htmlCannyCannySat, 17 Mar 2007 11:28:00 GMThttp://www.shnenglu.com/cannysyma/archive/2007/03/17/20029.html整型Q?br />C++ 基本整型 为?char ?short、?int、?long  其中每种cd都有有符L(fng)本和无符L(fng)本。因此d?U类型可供选择?br />C++ 寚w度的规定
short 臛_ 16?br />int 臛_和short 一样长
long 臛_32位,且至要和int 一样长?br />
无符L(fng)本??前面d关键字?unsigned
unsigned short           unsigned int   unsigned long             ,如果 只是 unsigned  是  unsigned int 的简写?br />



Canny 2007-03-17 19:28 发表评论
]]>
ŷþۺŷ| ޹˾þۺ| þˬˬƬAV| ɫþ| պƷþþþþþõӰ| 츾޾þĻ| Ʒþþþþ| 97þþþ| ɫþþþۺ| Сڵþþþþ| Ʒþþþþҹҹ| ŮþþŮ| ƷѾþ| þ޹˾Ʒɫ| ҹƷƬþ | þۺ˿ձ| պþþþĻ| ŮHҳþþ| þݺҹҹ2020츾| 99þۺϹƷ| ۺϾþþþþ| .Ʒþþ鶹Ʒ| һþaþþƷۺ㽶| ھƷþþþþþ97ţţ| ˺ݺۺ88ۺϾþ| þѹƷһ| þþŷղa| ޾Ʒþþþþ| wwwþ| 99þþþƷ| ޾ƷŮþþ| þۺ㽶AV| 69ƷþþþAPP| ŷ龫Ʒþþþþþ| þþþ| þԭƷ| þ97þ97Ʒӿ| Ʒպҹþ| ƷŮٸaѾþ| þWWW˳ɡƬ| þþƷɫ鶹|