为什么XmlDocument具有未在任何地方声明的命名空间(AFAIK)?

时间:2013-09-18 09:26:36

标签: c# xml xpath namespaces xsd

问题:

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

我有以下两个XML文件。

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

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

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

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

然而,这不起作用。

所以我检查了使用XMLQuire来获得所需的XPath,它告诉我geoname也一样,但对于Report,它告诉我XPath是这样的:

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

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

然而,我不明白为什么我的不工作?

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

Microsoft Reporting Service报告:

<?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文件(geonames):

<?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>

1 个答案:

答案 0 :(得分:1)

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