我有这样的东西:
uses MSXML2_TLB;
type TDocumentType = (dtOrder, dtInvoice, dtStatus, dtError); // And a few more, actually
function DetermineDocumentType(doc: IXMLDOMDocument2): TDocumentType;
...
它必须做一些简单的事情:确定Doc参数中包含哪种XML。XML可能类似于:
<Order>...</Order>
,
<Invoice>...</Invoice>
,
<Status>...</Status>
,
<Error>...</Error>
或者别的什么。这些文件的内部结构非常相似,所以通过从XML中获取第一个标记名来确定其类型的唯一可靠方法是。
doc.nodename和doc.basename不起作用。我可以将XML作为文本来读取,通过代码来解析它来确定标记名,但这是一个我拒绝使用的肮脏的技巧。所以我需要一个方法,通过IxmldomDocument2接口的适当方法返回标记名。
更糟糕的是,我无法控制这个函数之外的代码,而且作为第二个限制,这个根标记碰巧不区分大小写,使得使用selectnode()这样的技巧不可行。这是一个问题,因为以前的开发人员做过遗留代码和错误的决策。(幸运的是,在这个项目中只有根标签看起来很奇怪。)
顺便说一句,这个函数是用来替换在dailywtf站点上运行良好的类似函数。It previously would read the XML from the interface, convert it completely to uppercase and finally do a lot of pos() function calls to check for any of the possible tags. 效率不是很高,特别是因为这段代码必须处理几千个XML文件…
那么,如何在类型为ixmldomdocument2的对象中获取根元素的标记名呢?