当XMLDOMDocument自行保存时,如何让它包含XML声明,例如:
<?xml version="1.0" encoding="UTF-8" ?>
<?xml version="1.0" encoding="UTF-16" ?>
<?xml version="1.0" encoding="UCS-2" ?>
<?xml version="1.0" encoding="UCS-4" ?>
<?xml version="1.0" encoding="ISO-10646-UCS-2" ?>
<?xml version="1.0" encoding="UNICODE-1-1-UTF-8" ?>
<?xml version="1.0" encoding="UNICODE-2-0-UTF-16" ?>
<?xml version="1.0" encoding="UNICODE-2-0-UTF-8" ?>
<?xml version="1.0" encoding="US-ASCII" ?>
<?xml version="1.0" encoding="ISO-8859-1" ?>
<?xml version="1.0" encoding="WINDOWS-1250" ?>
XMLDOMDomcument对象正在内存中创建(即xml不是从某些外部源加载的):
{
IXMLDOMDocument2 doc = new DOMDocument60();
//add nodes to the doc
...
doc.Save(saveTarget);
}
Run Code Online (Sandbox Code Playgroud)
没有xml声明,你只能获得body xml,例如:
<Customer>
...
</Customer>
Run Code Online (Sandbox Code Playgroud)
而不是完整的XML文档:
<?xml version="1.0" encoding="US-ASCII" ?>
<Customer>
...
</Customer>
Run Code Online (Sandbox Code Playgroud)
如何控制XMLDOMDocument在保存到流时将使用的编码 …
我正在尝试根据它引用的模式验证XML文件.(使用Delphi和MSXML2_TLB.)代码的(相关部分)看起来像这样:
procedure TfrmMain.ValidateXMLFile;
var
xml: IXMLDOMDocument2;
err: IXMLDOMParseError;
schemas: IXMLDOMSchemaCollection;
begin
xml := ComsDOMDocument.Create;
if xml.load('Data/file.xml') then
begin
schemas := xml.namespaces;
if schemas.length > 0 then
begin
xml.schemas := schemas;
err := xml.validate;
end;
end;
end;
Run Code Online (Sandbox Code Playgroud)
这导致缓存被加载(schemas.length > 0
),但是下一个赋值引发了一个异常:"只能使用XMLSchemaCache-schemacollections."
我该怎么办呢?
我对MSXML 4.0有所了解.
Microsoft有一个页面,提供各种MSXML 4.0对象的CLSID和ProgID:
Symbolic Name: CLSID_DOMDocument40
GUID: {88d969c0-f192-11d4-a65f-0040963251e5}
ProgID: Msxml2.DOMDocument.4.0
Symbolic Name: CLSID_XMLSchemaCache40
GUID: {88d969c2-f192-11d4-a65f-0040963251e5}
ProgID: Msxml2.XMLSchemaCache.4.0
Run Code Online (Sandbox Code Playgroud)
但是,我的Vista机器或同事的XP机器上都没有注册ProgID或CLSID.
我很愿意到MSXML 5.0,这是在Windows XP和Windows Vista计算机-但我想,以确保我有尽可能广泛的兼容性; 我认为MSXML 4.0比MSXML 5.0更广泛.
Microsoft确实建议我使用MSXML 6.0:
建议您从早期版本的MSXML升级到MSXML 6.0.与早期的MSXML版本相比,MSXML 6.0提供了安全性和性能改进.
我有一个函数,使用MSXML发布一个XML文档,尽管没有对代码进行任何更改,但昨天开始失败.功能如下:
Public Function PostFile(ByVal address As String, ByVal data As Byte()) As xmldocument
Dim xmlHTTP As New MSXML2.XMLHTTP
Dim response As New XmlDocument
Dim xmlDoc As New MSXML2.DOMDocument
Try
xmlDoc.load(data)
xmlHTTP.open("post", address, False)
xmlHTTP.send(xmlDoc)
If xmlHTTP.responseXML.xml <> String.Empty Then
response.LoadXml(xmlHTTP.responseXML.xml)
Return response
Else
Dim result As String = "<NO_Response><Error>the post succeeded to " + address + " but there was no responce returned</Error><Hint>Check FireWall Settings</Hint></NO_Response>"
response.loadxml(result)
Return response
End If
Catch ex As Exception
'Error logging code removed
End Try …
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用MSXML 6.0 DOM对.XSD文件验证.XML文件但是在执行代码时我收到此错误消息:
Test.xsd#/schema/targetNamespace[1]
"The '' namespace provided differs from the schema's 'http://somewhere.com/root' targetNamespace."
Run Code Online (Sandbox Code Playgroud)
大量简化的.XML和.XSD文件版本也会产生相同的错误:
XML文件
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns2:noderoot xmlns:ns2="http://somewhere.com/root">
<general>
<year>2011</year>
<month>02</month>
</general>
</ns2:noderoot>
Run Code Online (Sandbox Code Playgroud)
XSD文件
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns="http://somewhere.com/root"
targetNamespace="http://somewhere.com/root"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
elementFormDefault="unqualified"
attributeFormDefault="unqualified">
<xs:complexType name="TYPE_nodeGeneral">
<xs:sequence>
<xs:element name="year">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:length value="4"/>
<xs:pattern value="\d{4}"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="month">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:length value="2"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:complexType name="TYPE_noderoot">
<xs:sequence>
<xs:element name="general" type="TYPE_nodeGeneral"></xs:element>
</xs:sequence>
</xs:complexType>
<xs:element name="noderoot" type="TYPE_noderoot"></xs:element>
</xs:schema>
Run Code Online (Sandbox Code Playgroud)
为了验证XML文件,我使用的是用VBA编写的代码(Excel 2010):
Sub …
Run Code Online (Sandbox Code Playgroud) 情况:1)我需要在Windows上用C++为我们的DLL进行HTTP [S]网络调用.2)需要支持至少XP(我猜SP3没问题)3)没有ATL,没有MFC,没有IE
问题:我最近从Boost cpp-netlib切换到使用MSXML的IXMLHTTPRequest来满足我们(非常简单)的Windows网络需求.虽然一切似乎都很好,但我们注意到重定向不起作用.在fiddler中,我得到一个HTTP 302,然后是第二个成功的HTTP 200请求/响应.
但是在实际的C++代码中,我从IXMLHTTPRequest-> Send获得了E_ACCESSDENIED,并且HTTP响应代码为零.所以在代码中我无法知道实际发生了什么.
从Fiddler开始,一切正常,我尝试将其设置为异步并检查回调,还尝试了IXMLHttpServerRequest,IXMLHttpServerRequest2和MSXML v6,但都没有工作.
注意:我们在WinRT上使用IXMLHttpRequest2并且工作正常(处理OnRedirect事件).
反正有没有让MSXML的IXMLHTTPRequest来处理重定向?
或者我是否需要切换到WinInet/WinSockets/WinHttp?我认为我需要使用WinHttp(因为我需要支持Windows服务/ IIS,WInInet显然没有,而WinSockets对我的需求来说太低了我认为).
谢谢!
这不是一个问题,因为我已经找到了解决方案.我花了很多时间,这就是我想在这里解释的原因.
Msxml基于COM,因此即使你有有用的类来处理内存分配问题,它也不是很容易在C++中使用.但是编写一个新的XML解析器要困难得多,所以我想使用msxml.
问题:
我能够在互联网上找到足够的例子来帮助使用msxml CComPtr
(智能指针避免必须手动调用每个IXMLDOMNode的Release()),CComBSTR
(将C++字符串转换为字符串的COM格式)和CComVariant
.这3个有用的课程是ATL课程,需要一个#include <atlbase.h>
.
问题:Visual Studio 2008 Express(免费版)不包含ATL.
解:
使用comutil.h
和comdef.h
,包括一些简单的帮助程序类:
_bstr_t
或多或少取代 CComBSTR
_variant_t
或多或少取代 CComVariant
_com_ptr_t
CComPtr
通过使用间接取代_COM_SMARTPTR_TYPEDEF
小例子:
#include <msxml.h>
#include <comdef.h>
#include <comutil.h>
// Define some smart pointers for MSXML
_COM_SMARTPTR_TYPEDEF(IXMLDOMDocument, __uuidof(IXMLDOMDocument)); // IXMLDOMDocumentPtr
_COM_SMARTPTR_TYPEDEF(IXMLDOMElement, __uuidof(IXMLDOMElement)); // IXMLDOMElementPtr
_COM_SMARTPTR_TYPEDEF(IXMLDOMNodeList, __uuidof(IXMLDOMNodeList)); // IXMLDOMNodeListPtr
_COM_SMARTPTR_TYPEDEF(IXMLDOMNamedNodeMap, __uuidof(IXMLDOMNamedNodeMap)); // IXMLDOMNamedNodeMapPtr
_COM_SMARTPTR_TYPEDEF(IXMLDOMNode, __uuidof(IXMLDOMNode)); // IXMLDOMNodePtr
void test_msxml()
{
// This program will use COM
CoInitializeEx(NULL, COINIT_MULTITHREADED);
{
// …
Run Code Online (Sandbox Code Playgroud) 以下VBA代码生<?xml version="1.0"?>
成为输出.
Dim XML As New DomDocument
Dim pi As IXMLDOMProcessingInstruction
'.... some code that sets the root element of the document
Set pi = XML.createProcessingInstruction("xml", "version='1.0' encoding='UTF-8'")
XML.insertBefore pi, XML.documentElement
Run Code Online (Sandbox Code Playgroud)
为什么encoding="UTF-8"
遗漏了?
我有一个经典的ASP页面,我试图在Windows 7上的IIS上进行调试.该页面在另一台运行不同网络上的Windows Server 2003的计算机上正常工作.此外,在Windows 7计算机上,我可以在浏览器中成功打开相关URL.
执行带有错误的ServerXMLHTTP.send()时页面失败:
msxml3.dll error '80072efd'
A connection with the server could not be established
Run Code Online (Sandbox Code Playgroud)
有问题的代码看起来像这样(最后一行失败):
set xmlHTTP = server.CreateObject("MSXML2.ServerXMLHTTP")
xmlHTTP.open "get", "http://stackoverflow.com", False
xmlHTTP.send
Run Code Online (Sandbox Code Playgroud)
我一直在搜索,最有帮助的建议是使用NetSh为winHTTP设置代理.有问题的机器在使用代理服务器的网络上.但是,即使在设置代理并重新启动后,我仍然会得到相同的错误.
更改
set xmlHTTP = server.CreateObject("MSXML2.ServerXMLHTTP")
Run Code Online (Sandbox Code Playgroud)
至
set xmlHTTP = server.CreateObject("MSXML2.XMLHTTP")
Run Code Online (Sandbox Code Playgroud)
产生略有不同的错误:
msxml3.dll error '800c0005'
The system cannot locate the resource specified.
Run Code Online (Sandbox Code Playgroud)
我还尝试安装MSXML4 SP3并使用以下方法显式创建v4对象:
set xmlHTTP = server.CreateObject("MSXML2.ServerXMLHTTP.4.0")
Run Code Online (Sandbox Code Playgroud)
我仍然得到相同的错误,除了消息中的msxml4.dll.
最后,我尝试关闭我的Forefront TMG代理客户端,告诉我的浏览器不要使用代理,并使用netsh重置winHTTP的代理.即使浏览器仍然可以访问互联网,仍然会出现相同的错误.
从我发现的情况来看,我认为这必须是这个特定机器通过它所在的特定网络连接的问题.但是,我不知道问题是什么.任何建议都感激不尽.
我正在尝试使用MS XMLHTTP COM检索HTTP文档的内容.我确实复制了以下示例代码,但即使这样也无效,并且在发送方法调用时出现EOLEException错误"访问被拒绝"失败.
uses
MSXML, ComObj, ActiveX;
procedure TForm1.Button1Click(Sender: TObject);
var
httpDoc: XMLHTTP; // IXMLHTTPRequest
begin
httpDoc := CreateOleObject('MSXML2.XMLHTTP') as XMLHTTP;
try
httpDoc.open('GET', 'http://www.google.com/index.html', False, EmptyParam, EmptyParam);
httpDoc.send(''); // <-- EOLEException 'Access is denied'
if (httpDoc.readyState = 4) and (httpDoc.status = 200) then
ShowMessage(httpDoc.responseText);
finally
httpDoc := nil;
end;
end;
Run Code Online (Sandbox Code Playgroud)
我真的不知道我做错了什么:(