标签: msxml

如何使XMLDOMDocument包含XML声明?

当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)

问题2

如何控制XMLDOMDocument在保存到流时将使用的编码 …

xml msxml dom

8
推荐指数
1
解决办法
1万
查看次数

在delphi中使用msxml进行模式验证

我正在尝试根据它引用的模式验证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."

我该怎么办呢?

xml delphi xsd msxml dtd

7
推荐指数
1
解决办法
2万
查看次数

什么变成了MSXML 4.0?

我对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机器上都没有注册ProgIDCLSID.

  • MSXML 4.0只附带了一些版本的Office(例如Office 2003中)?
  • 它最初是与Windows XP一起发布的,但后来的服务包将其删除了吗?
  • 是否存在安全漏洞,并且已被删除
  • 它是否只是被depricated

我很愿意到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提供了安全性和性能改进.

xml msxml msxml6

7
推荐指数
1
解决办法
3342
查看次数

MSXML"系统找不到指定的资源"

我有一个函数,使用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)

vb.net msxml

7
推荐指数
1
解决办法
3万
查看次数

MSXML VBA:针对XSD验证XML:"提供的''命名空间与架构的targetNamespace不同."

我正在尝试使用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)

xml vba xsd msxml dom

7
推荐指数
1
解决办法
2万
查看次数

如何让MSXML IXMLHTTPRequest处理HTTP重定向?

情况: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对我的需求来说太低了我认为).

谢谢!

windows winapi msxml msxml3

7
推荐指数
1
解决办法
873
查看次数

如何将msxml与Visual Studio 2008 Express(没有ATL类)一起使用而不会变得疯狂?

这不是一个问题,因为我已经找到了解决方案.我花了很多时间,这就是我想在这里解释的原因.

Msxml基于COM,因此即使你有有用的类来处理内存分配问题,它也不是很容易在C++中使用.但是编写一个新的XML解析器要困难得多,所以我想使用msxml.

问题:

我能够在互联网上找到足够的例子来帮助使用msxml CComPtr(智能指针避免必须手动调用每个IXMLDOMNode的Release()),CComBSTR(将C++字符串转换为字符串的COM格式)和CComVariant.这3个有用的课程是ATL课程,需要一个#include <atlbase.h>.

问题:Visual Studio 2008 Express(免费版)不包含ATL.

解:

使用comutil.hcomdef.h,包括一些简单的帮助程序类:

  • _bstr_t 或多或少取代 CComBSTR
  • _variant_t 或多或少取代 CComVariant
  • _com_ptr_tCComPtr通过使用间接取代_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)

c++ xml msxml visual-studio-2008

6
推荐指数
2
解决办法
1万
查看次数

为什么MSXML中的createProcessingInstruction会生成不完整的输出?

以下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"遗漏了?

xml ms-access msxml access-vba

6
推荐指数
2
解决办法
8187
查看次数

在Windows 7上的经典ASP中执行ServerXMLHTTP.send时出现MSXML3.dll 80072efd和800c0005错误

我有一个经典的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的代理.即使浏览器仍然可以访问互联网,仍然会出现相同的错误.

从我发现的情况来看,我认为这必须是这个特定机器通过它所在的特定网络连接的问题.但是,我不知道问题是什么.任何建议都感激不尽.

iis-7 msxml asp-classic

6
推荐指数
1
解决办法
3万
查看次数

XMLHTTP和"拒绝访问"错误

我正在尝试使用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)

我真的不知道我做错了什么:(

delphi msxml xmlhttprequest

6
推荐指数
1
解决办法
2312
查看次数