0

问题:

我正在使用 System.Xml.XmlDocument 和 XPath 查询,从 Microsoft Reporting Services 报告中提取信息。

我有以下两个 XML 文件。

如果我想检查第二个文件是否具有名称属性 = London 的 (geoname) 条目,我可以使用此 XPath 查询:

/geonames/geoname[1]/name[text()="London"]

另一方面,如果我想检查报告是否有一个名为 in_sprache 的 ReportParameter,我希望我可以使用这个 XPath 查询:

/Report/ReportParameters/ReportParameter[@Name="in_sprache"]

但是,这是行不通的。

所以我检查了使用 XMLQuire 来获取所需的 XPath,它告诉我地理名称的相同,但对于报告,它告诉我 XPath 是这样的:

/dft:Report/dft:ReportParameters/dft:ReportParameter[@Name="in_sprache"]

现在 XMLQuire 是对的,这个 XPath 确实有效(在命名空间管理器中声明 dft 之后)。

但是,我不明白的是为什么我的不起作用???

从我所见,任何地方都没有定义命名空间 dft (=default ???)。
然而 XMLQuire 找到了它,所以它一定在某个地方。
那么为什么报告有(需要)一个 dft 命名空间,而第二个没有?
我只看到声明了一个 rd 命名空间...

微软报告服务报告:

<?xml version="1.0" encoding="utf-8"?>
<Report xmlns="http://schemas.microsoft.com/sqlserver/reporting/2005/01/reportdefinition" xmlns:rd="http://schemas.microsoft.com/SQLServer/reporting/reportdesigner">
<DataSources>
<DataSource Name="COR_Basic">
<rd:DataSourceID>addde073-f37c-4b59-ae3a-25231ffc0ec6</rd:DataSourceID>
<DataSourceReference>COR_Basic</DataSourceReference>
</DataSource>
</DataSources>
<InteractiveHeight>29.7cm</InteractiveHeight>
<ReportParameters>
<ReportParameter Name="in_mandant">
<DataType>String</DataType>
<DefaultValue>
<Values>
<Value>0</Value>
</Values>
</DefaultValue>
<Prompt>Mandant</Prompt>
<Hidden>true</Hidden>
</ReportParameter>
<ReportParameter Name="in_sprache">
<DataType>String</DataType>
<DefaultValue>
<Values>
<Value>de</Value>
</Values>
</DefaultValue>
<Prompt>in_sprache</Prompt>
<Hidden>true</Hidden>
</ReportParameter>
<ReportParameter Name="in_standort">
<DataType>String</DataType>
<DefaultValue>
<DataSetReference>
<DataSetName>SEL_Standort</DataSetName>
<ValueField>RPT_UID</ValueField>
</DataSetReference>
</DefaultValue>
<Prompt>Standort</Prompt>
<ValidValues>
<DataSetReference>
<DataSetName>SEL_Standort</DataSetName>
<ValueField>RPT_UID</ValueField>
<LabelField>RPT_Name</LabelField>
</DataSetReference>
</ValidValues>
</ReportParameter>

第二个文件是

任意 XML 文件(地名):

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<geonames style="MEDIUM">
<totalResultsCount>6987</totalResultsCount>
<geoname>
<name>London</name>
<lat>51.5084152563931</lat>
<lng>-0.125532746315002</lng>
<geonameId>2643743</geonameId>
<countryCode>GB</countryCode>
<countryName>United Kingdom</countryName>

<fcl>P</fcl>
<fcode>PPLC</fcode>
</geoname>
<geoname>
<name>London</name>
<lat>42.983389283</lat>
<lng>-81.233042387</lng>
<geonameId>6058560</geonameId>
<countryCode>CA</countryCode>
<countryName>Canada</countryName>

<fcl>P</fcl>
<fcode>PPL</fcode>
</geoname>
<geoname>
<name>East London</name>
<lat>-33.0152850934643</lat>
<lng>27.9116249084473</lng>
<geonameId>1006984</geonameId>
<countryCode>ZA</countryCode>
<countryName>South Africa</countryName>

<fcl>P</fcl>
<fcode>PPL</fcode>
</geoname>
<geoname>
<name>City</name>
<lat>51.5133363996235</lat>
<lng>-0.0890064239501953</lng>
<geonameId>2643744</geonameId>
<countryCode>GB</countryCode>
<countryName>United Kingdom</countryName>

<fcl>A</fcl>
<fcode>ADM2</fcode>
</geoname>
<geoname>
<name>London</name>
<lat>37.1289771</lat>
<lng>-84.0832646</lng>
<geonameId>4298960</geonameId>
<countryCode>US</countryCode>
<countryName>United States</countryName>

<fcl>P</fcl>
<fcode>PPL</fcode>
</geoname>
<geoname>
<name>The Tower of London</name>
<lat>51.5082349601834</lat>
<lng>-0.0763034820556641</lng>
<geonameId>6286786</geonameId>
<countryCode>GB</countryCode>
<countryName>United Kingdom</countryName>

<fcl>S</fcl>
<fcode>CSTL</fcode>
</geoname>
<geoname>
<name>London Reefs</name>
<lat>8.85</lat>
<lng>112.5333333</lng>
<geonameId>1879967</geonameId>
<countryCode>  </countryCode>
<countryName>  </countryName>

<fcl>U</fcl>
<fcode>RFSU</fcode>
</geoname>
<geoname>
<name>Greater London</name>
<lat>51.5</lat>
<lng>-0.1666667</lng>
<geonameId>2648110</geonameId>
<countryCode>GB</countryCode>
<countryName>United Kingdom</countryName>

<fcl>A</fcl>
<fcode>ADM2</fcode>
</geoname>
<geoname>
<name>London</name>
<lat>46.1666667</lat>
<lng>6.0166667</lng>
<geonameId>2661811</geonameId>
<countryCode>CH</countryCode>
<countryName>Switzerland</countryName>

<fcl>H</fcl>
<fcode>STM</fcode>
</geoname>
<geoname>
<name>London Borough of Islington</name>
<lat>51.5333333</lat>
<lng>-0.1333333</lng>
<geonameId>3333156</geonameId>
<countryCode>GB</countryCode>
<countryName>United Kingdom</countryName>

<fcl>A</fcl>
<fcode>ADM2</fcode>
</geoname>
</geonames>
4

1 回答 1

1

命名空间是用特殊的xmlns“属性”定义的。在根元素上定义了两个命名空间,其中一个声明了它的前缀 ( rd),另一个没有。后者是节点所有后代的默认命名空间,如果未另行声明。

于 2013-09-18T09:31:14.007 回答