C# 为什么XmlDocument有一个未在任何地方声明的名称空间(AFAIK)?

C# 为什么XmlDocument有一个未在任何地方声明的名称空间(AFAIK)?,c#,xml,xpath,namespaces,xsd,C#,Xml,Xpath,Namespaces,Xsd,问题: 我正在使用System.Xml.XmlDocument和XPath查询从Microsoft Reporting Services报告中提取信息。 我有以下两个XML文件 如果我想检查第二个文件是否有name attribute=London的(geoname)条目,我可以使用以下XPath查询: /geonames/geoname[1]/name[text()="London"] 另一方面,如果我想检查报告是否有一个名为in_sprache的ReportParameter,我希望可以使

问题:

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

我有以下两个XML文件

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

/geonames/geoname[1]/name[text()="London"]
另一方面,如果我想检查报告是否有一个名为in_sprache的ReportParameter,我希望可以使用以下XPath查询:

/Report/ReportParameters/ReportParameter[@Name="in_sprache"]
然而,这是行不通的

所以我检查了使用XMLQuire来获得所需的XPath,它告诉我geoname也是这样,但对于报告,它告诉我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>

地址:073-f37c-4b59-ae3a-25231ffc0ec6
COR_Basic
29.7厘米
一串
0
曼丹特
真的
一串
判定元件
斯普拉奇
真的
一串
塞卢站
RPT_UID
立场
塞卢站
RPT_UID
RPT_名称
第二个文件是

任意XML文件(地理名称):


6987
伦敦
51.5084152563931
-0.125532746315002
2643743
国标
大不列颠联合王国
P
PPLC
伦敦
42.983389283
-81.233042387
6058560
加利福尼亚州
加拿大
P
PPL
东伦敦
-33.0152850934643
27.9116249084473
1006984
ZA
南非
P
PPL
城市
51.5133363996235
-0.0890064239501953
2643744
国标
大不列颠联合王国
A.
ADM2
伦敦
37.1289771
-84.0832646
4298960
美国
美国
P
PPL
伦敦塔
51.5082349601834
-0.0763034820556641
6286786
国标
大不列颠联合王国
s
CSTL
尹庆群礁
8.85
112.5333333
1879967
U
RFSU
大伦敦
51.5
-0.1666667
2648110
国标
大不列颠联合王国
A.
ADM2
伦敦
46.1666667
6.0166667
2661811
中国
瑞士
H
扫描隧道显微镜
伦敦伊斯灵顿区
51.5333333
-0.1333333
3333156
国标
大不列颠联合王国
A.
ADM2

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

Ah,并且由于Report是根元素,除非另有说明,否则将继承到子代。在geonames上,它可以工作,因为它没有任何xmlns属性。这澄清了这一点。如果xmlns但没有前缀,则前缀=dft。
<?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>