Martijn到his answer。
該屬性實際上稱爲DOMVendor。
下面是一些示例代碼,顯示了這是如何工作的。
示例代碼取決於您可以在bo.codeplex.com上找到的一些幫助程序類。
請注意,DOMVendor不會告訴你你有什麼版本的MSXML,但你可以問它是否有XPath支持。
舊的MSXML版本(仍然在現場,例如在普通的香草Windows 2003 Server安裝中)將不支持XPath
,但支持XSLPattern
。
他們會很高興地執行您的查詢,但有時會返回不同的結果或barf。
MSXML6的各個子版本中也有some sublte bugs。
您需要6.30。 ,6.20.1103。,6.20.2003.0或更高版本。 6.3僅在Windows 7/Windows 2008 Server上可用。 Windows XP和Windows 2003 Server上的6.20版本。
找出which versions actually work我花了相當長的一段時間:-)
這說明您已安裝的MSXML,在我的情況msxml6.dll: 6.20.1103.0
:
procedure TMainForm.ShowMsxml6VersionClick(Sender: TObject);
begin
{
Windows 2003 with MSXML 3: msxml3.dll: 8.100.1050.0
windows XP with MSXML 4: msxml4.dll: 4.20.9818.0
Windows XP with MSXML 6 SP1: msxml6.dll: 6.10.1129.0
windows XP with MSXML 6 SP2 (latest):
------------------------
msxml6.dll: 6.20.1103.0
Windows 7 with MSXML 6 SP3:
--------------------------
msxml6.dll: 6.30.7600.16385
}
try
Logger.Log(TmsxmlFactory.msxmlBestFileVersion.ToString());
TmsxmlFactory.AssertCompatibleMsxml6Version();
except
on E: Exception do
begin
Logger.Log('Error');
Logger.Log(E);
end;
end;
end;
這顯示了DOMVendor
代碼,這讓一些使用輔助類的,你可以找到上
procedure TMainForm.FillDomVendorComboBox;
var
DomVendorComboBoxItemsCount: Integer;
Index: Integer;
CurrentDomVendor: TDOMVendor;
DefaultDomVendorIndex: Integer;
CurrentDomVendorDescription: string;
const
NoSelection = -1;
begin
DomVendorComboBox.Clear;
DefaultDomVendorIndex := NoSelection;
for Index := 0 to DOMVendors.Count - 1 do
begin
CurrentDomVendor := DOMVendors.Vendors[Index];
LogDomVendor(CurrentDomVendor);
CurrentDomVendorDescription := CurrentDomVendor.Description;
DomVendorComboBox.Items.Add(CurrentDomVendorDescription);
if DefaultDOMVendor = CurrentDomVendorDescription then
DefaultDomVendorIndex := DomVendorComboBox.Items.Count - 1;
end;
DomVendorComboBoxItemsCount := DomVendorComboBox.Items.Count;
if (DefaultDomVendorIndex = NoSelection) then
begin
if DefaultDOMVendor = NullAsStringValue then
begin
if DomVendorComboBoxItemsCount > 0 then
DefaultDomVendorIndex := 0;
end
else
DefaultDomVendorIndex := DomVendorComboBoxItemsCount - 1;
end;
DomVendorComboBox.ItemIndex := DefaultDomVendorIndex;
end;
procedure TMainForm.LogDomVendor(const CurrentDomVendor: TDOMVendor);
var
CurrentDomVendorDescription: string;
DocumentElement: IDOMElement;
DomDocument: IDOMDocument; // xmldom.IDOMDocument is the plain XML DOM
XmlDocument: IXMLDocument; // XMLIntf.IXMLDocument is the enrichted XML interface to the TComponent wrapper, which has a DOMDocument: IDOMDocument poperty, and allows obtaining XML from different sources (text, file, stream, etc)
XmlDocumentInstance: TXMLDocument; // unit XMLDoc
DOMNodeEx: IDOMNodeEx;
XMLDOMDocument2: IXMLDOMDocument2;
begin
CurrentDomVendorDescription := CurrentDomVendor.Description;
Logger.Log('DOMVendor', CurrentDomVendorDescription);
XmlDocumentInstance := TXMLDocument.Create(nil);
XmlDocumentInstance.DOMVendor := CurrentDomVendor;
XmlDocument := XmlDocumentInstance;
DomDocument := CurrentDomVendor.DOMImplementation.createDocument(NullAsStringValue, NullAsStringValue, nil);
XmlDocument.DOMDocument := DomDocument;
XmlDocument.LoadFromXML('<document/>');
DomDocument := XmlDocument.DOMDocument; // we get another reference here, since we loaded some XML now
DocumentElement := DomDocument.DocumentElement;
if Assigned(DocumentElement) then
begin
DOMNodeEx := DocumentElement as IDOMNodeEx;
Logger.Log(DOMNodeEx.xml);
end;
if IDomNodeHelper.GetXmlDomDocument2(DomDocument, XMLDOMDocument2) then
begin
// XSLPattern versus XPath
// see https://stackoverflow.com/questions/784745/accessing-comments-in-xml-using-xpath
// XSLPattern is 0 based, but XPath is 1 based.
Logger.Log(IDomNodeHelper.SelectionLanguage, string(XMLDOMDocument2.getProperty(IDomNodeHelper.SelectionLanguage)));
Logger.Log(IDomNodeHelper.SelectionNamespaces, string(XMLDOMDocument2.getProperty(IDomNodeHelper.SelectionNamespaces)));
end;
LogDomVendorFeatures(CurrentDomVendor,
['','1.0','2.0', '3.0'],
//http://www.w3.org/TR/DOM-Level-3-Core/introduction.html#ID-Conformance
//http://reference.sitepoint.com/javascript/DOMImplementation/hasFeature
['Core'
,'XML'
,'Events'
,'UIEvents'
,'MouseEvents'
,'TextEvents'
,'KeyboardEvents'
,'MutationEvents'
,'MutationNameEvents'
,'HTMLEvents'
,'LS'
,'LS-Async'
,'Validation'
,'XPath'
]);
end;
procedure TMainForm.LogDomVendorFeatures(const CurrentDomVendor: TDOMVendor; const Versions, Features: array of string);
var
AllVersions: string;
Feature: string;
Line: string;
Supported: Boolean;
SupportedAll: Boolean;
SupportedNone: Boolean;
SupportedVersions: IStringListWrapper;
Version: string;
begin
SupportedVersions := TStringListWrapper.Create();
for Version in Versions do
AddSupportedVersion(Version, SupportedVersions);
AllVersions := Format('All: %s', [SupportedVersions.CommaText]);
for Feature in Features do
begin
SupportedAll := True;
SupportedNone := True;
SupportedVersions.Clear();
for Version in Versions do
begin
Supported := CurrentDomVendor.DOMImplementation.hasFeature(Feature, Version);
if Supported then
AddSupportedVersion(Version, SupportedVersions);
SupportedAll := SupportedAll and Supported;
SupportedNone := SupportedNone and not Supported;
end;
if SupportedNone then
Line := Format('None', [])
else
if SupportedAll then
Line := Format('%s', [AllVersions])
else
Line := Format('%s', [SupportedVersions.CommaText]);
Logger.Log(' ' + Feature, Line);
end;
end;
德爾福XE會顯示這些:
DOMVendor:MSXML
<document/>
SelectionLanguage:XPath
SelectionNamespaces:
Core:None
XML:Any,1.0
Events:None
UIEvents:None
MouseEvents:None
TextEvents:None
KeyboardEvents:None
MutationEvents:None
MutationNameEvents:None
HTMLEvents:None
LS:None
LS-Async:None
Validation:None
XPath:Any,1.0
DOMVendor:ADOM XML v4
?<document></document>
Core:None
XML:None
Events:None
UIEvents:None
MouseEvents:None
TextEvents:None
KeyboardEvents:None
MutationEvents:None
MutationNameEvents:None
HTMLEvents:None
LS:None
LS-Async:None
Validation:None
XPath:None
的問題都與默認的命名空間;刪除'xmlns =「http://schemas.microsoft.com/search/local/ws/rest/v1」'然後工作就好了:'// Link [@ role =「self」] [1] /節點()'。我不知道你爲什麼在你的例子中有'[3]',因爲文檔中只有一個'Link'節點;我不喜歡解決方案,刪除默認名稱空間聲明,只是似乎很hacky ... – 2011-04-01 10:54:08
我現在已經從查詢中刪除了[3],因爲這顯然是我的錯誤。 – 2011-04-01 11:25:07
[Delphi/MSXML:XPath查詢失敗]的可能重複(http://stackoverflow.com/questions/1519416/delphi-msxml-xpath-queries-fail) – 2011-04-01 15:28:42