引用未声明的命名空间前缀

时间:2018-02-23 08:40:32

标签: xml vba excel-vba xml-namespaces msxml

我有一个如下所示的XML文件:

<xc:XmlCache xmlns:xc="XmlCache" xmlns:mp="mx.MarketParameters" xmlns:rt="mx.MarketParameters.Rates" xmlns:rtcu="mx.MarketParameters.Rates.Curve">
    <xc:XmlCacheArea xc:value="MarketParameters">
        <mp:nickName xc:value="MDS" xmlns:mp="mx.MarketParameters">
            <mp:date xc:value="20160518">
                <rt:rate xmlns:rt="mx.MarketParameters.Rates">
                    <rtcu:curve xmlns:rtcu="mx.MarketParameters.Rates.Curve">
                        <rtcu:currency xc:value="AED">
                            <rtcu:label xc:value="AED FX">
                                <rtcu:type xc:value="Swap point">
                                    <rtcu:generator xc:value="USD/AED">
                                        <rtcu:market xc:value="">
                                            <rtcu:maturity xc:value="10M" xc:dates="20160523-20170323" xc:type="Fields">

我想在VBA中获取类型rtcu:maturity的节点列表以执行某些操作:

Dim xmlCurvesFileDOMDocument As New DOMDocument60
Dim listOfMaturities As IXMLDOMNodeList

xmlCurvesFileDOMDocument.Load (xmlCurvesFilePath)
Set listOfMaturities = xmlCurvesFileDOMDocument.SelectNodes("//xc:XmlCache/xc:XmlCacheArea/mp:nickName/mp:date/rt:rate/rtcu:curve/rtcu:currency/rtcu:label/rtcu:type/rtcu:generator/rtcu:market/rtcu:maturity")

(注意:我省略了xmlCurvesFilePath,但它是正确的,文件已加载)。

当我运行它时,在listOfMaturities的集合上,我收到Reference to undeclared namespace prefix: 'xc'类型的错误。如果我从路径中删除xc,它会告诉我问题是另一个问题(mp)。如果我从XPath中删除所有命名空间,它可以工作,但它什么都不加载。

我试图搜索堆栈溢出,似乎解决方案是设置选择名称空间(如herehere)。

然而,当我尝试这样做时:

xmlCurvesFileDOMDocument.setProperty("SelectionNamespaces", "xmlns:xc='XmlCache'")

...我收到编译错误,告诉我“Expected : =”。

有没有人知道我如何声明我的命名空间并解析这个XML文件?

3 个答案:

答案 0 :(得分:1)

加载包含名称空间的XML文件

您在加载前没有设置命名空间,请尝试此代码,包括加载错误例程:

contours =  cv2.findContours(img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cv2.drawContours(img, contours, -1, (0, 255, 0), 3)

答案 1 :(得分:0)

使用Xml Linq

Imports System.Xml
Imports System.Xml.Linq
Module Module1
    Const FILENAME As String = "c:\temp\test.xml"
    Sub Main()
        Dim doc As XDocument = XDocument.Load(FILENAME)
        Dim namespaces = doc.Descendants().Select(Function(x) New With {.ns = IIf(x.ToString().Contains(":"), x.ToString().Substring(1, x.ToString().IndexOf(":")), String.Empty), .name = x.Name.LocalName}).ToArray()
    End Sub

End Module

答案 2 :(得分:0)

最后,错误只是语法。 而不是:

xmlCurvesFileDOMDocument.setProperty("SelectionNamespaces", "xmlns:xc='XmlCache'")

...我不得不用括号编写它,声明所有命名空间:

xmlCurvesFileDOMDocument.setProperty "SelectionNamespaces", "xmlns:xc='XmlCache' xmlns:mp='mx.MarketParameters'" etc.