【问题标题】:Why does XmlDocument have a namespace that is not declared anywhere (AFAIK)?为什么 XmlDocument 有一个未在任何地方声明的命名空间(AFAIK)?
【发布时间】:2013-09-22 23:49:23
【问题描述】:

问题:

我正在处理 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,它告诉我 geoname 的情况相同,但对于报告,它告诉我 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>

【问题讨论】:

    标签: c# xml xpath namespaces xsd


    【解决方案1】:

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

    【讨论】:

    • 啊,因为 Report 是根元素,除非另有说明,否则它会向下继承到后代。在地名上它可以工作,因为它没有任何 xmlns 属性。这澄清了它。如果 xmlns 但没有前缀,则前缀 = dft.
    猜你喜欢
    • 2016-01-27
    • 2011-12-10
    • 1970-01-01
    • 2012-11-09
    • 2015-11-21
    • 2012-07-19
    • 1970-01-01
    • 2015-02-01
    相关资源
    最近更新 更多