【问题标题】:How can I prevent appendChild() from adding the xmlns=""如何防止 appendChild() 添加 xmlns=""
【发布时间】:2010-11-15 22:10:48
【问题描述】:

这是我的代码的 sn-p。

FilterText = HttpUtility.UrlDecode(FilterTxt.Value.ToString());
               XmlWriterSettings settings = new XmlWriterSettings();
               settings.Indent = true;
               TextWriter tw = new StreamWriter("D:\\FilterTest.rdl");
               tw.WriteLine(FilterText);
               tw.Close();
               XmlDocument reportrdl = new XmlDocument();
               reportrdl.Load(ReportFile);
               NMS = reportrdl.NamespaceURI;
               XmlNodeList fieldsnode = reportrdl.GetElementsByTagName("DataSet");
               //XmlElement xoo = reportrdl.CreateElement("Filters", NMS);
               //reportrdl.AppendChild(xoo);
               foreach (XmlNode fields in fieldsnode)
               {
                   // second document to merge (the new Filter File)

                   XmlDocument filterrdl = new XmlDocument();
                   filterrdl.Load("D:\\FilterTest.rdl");

                   XmlNode imported = reportrdl.ImportNode(filterrdl.DocumentElement, true);

                   fields.AppendChild(imported);
                   break;
               }
               //XmlNodeList filtersnode = reportrdl.GetElementsByTagName("Filters");
               //foreach (XmlNode filters in filtersnode)
               //{
               //    filters.Attributes.RemoveNamedItem("xmlns");
               // }
               reportrdl.Save("D:\\NewFilter.rdl");

这里是rdl文件的sn-p:

<Report xmlns="http://schemas.microsoft.com/sqlserver/reporting/2005/01/reportdefinition" xmlns:rd="http://schemas.microsoft.com/SQLServer/reporting/reportdesigner">
  <DataSources>
    <DataSource Name="BOSS">
      <rd:DataSourceID>c6a8409e-71a4-4e96-86ad-b300a5b942c3</rd:DataSourceID>
      <ConnectionProperties>
        <DataProvider>SQL</DataProvider>
        <ConnectString>dats a no no</ConnectString>
        <IntegratedSecurity>true</IntegratedSecurity>
      </ConnectionProperties>
    </DataSource>
  </DataSources>

&lt;Query&gt;之后的这个文件中,我需要合并到&lt;Filters&gt;

这是那个文件:

<Filters>
  <Filter>
    <FilterExpression>=Fields!RoleID.Value</FilterExpression>
    <Operator>Equal</Operator>
    <FilterValues>
      <FilterValue>=27</FilterValue>
    </FilterValues>
  </Filter>
</Filters>

结束&lt;Filters xmlns=""&gt; 而不是&lt;Filters&gt;

谢谢

【问题讨论】:

  • 我不太清楚你的问题是什么,你能否整理一下这个问题,并举例说明你得到了什么以及你想要发生什么?
  • 它实际上非常简单我有一个包含用于过滤器的 XML 的文件,我想将它合并到另一个 xml 文件(报告 rdl)中。我发现我可以做到,但是当 AppendChild 添加节点时,它会添加 xmlns="" 的属性,然后以 我根本不想要 xmlns=""。

标签: c# xml reporting-services xml-namespaces


【解决方案1】:

您需要向我们展示您尝试合并的两个文件的 XML 示例。

可能发生的情况是,在第一个文件reportrdl 中,DataSet 元素位于“”之外的默认命名空间声明下。因此,它们下的每个没有命名空间前缀并且没有覆盖默认命名空间声明的元素都将位于其祖先声明的默认命名空间中。

但是您正在导入不在该命名空间中且没有前缀的 Filters 元素。因此,为了防止他们继承不适用于他们的默认命名空间,他们需要取消声明默认命名空间,这是使用xmlns="" 完成的。

如果不是上述情况,请提供这两个 XML 文档的样本,所以我们不会在黑暗中做手术。

如果上述情况,那么你的问题是,为什么你不想在输出中出现xmlns=""?听起来这是正确的输出。 但也许您不想要它,因为您希望导入的 Filters 元素与其父元素位于同一命名空间中;在这种情况下,您需要更改imported 的命名空间。然后是命名空间声明。

或者您可能希望导入的节点不在命名空间中,因此输出在技术上已经正确,但您不喜欢 xmlns="" 的美学。或者,可能有一个下游 XML 使用者由于某种原因阻塞了xmlns=""。告诉我们更多关于您的限制,以便我们知道如何提供帮助。

更新:

好的,现在我们知道了

  • 第一个文件中的元素位于reportdefinition 命名空间中,其URL 为"http://schemas.microsoft.com/sqlserver/reporting/2009/01/reportdefinition"。我们可以看出,因为顶级元素&lt;Report&gt; 上面有默认命名空间声明:xmlns="http://schemas.microsoft.com.../reportdefinition"。这意味着对于&lt;Report&gt; 和所有后代,任何没有命名空间前缀的元素都被视为在reportdefinition 命名空间中。
  • 导入文件中的元素,如&lt;Filters&gt;应该在同一个reportdefinition命名空间中。我从MS documentation 推断出这一点,虽然还不清楚。不幸的是,这些文档的大部分内容都很糟糕......甚至充满了ill-formed XML
  • 但是,导入的 &lt;Filters&gt; 元素和后代实际上不在命名空间中(在导入它们之前),因为它们没有命名空间前缀,也没有默认命名空间声明。

因此,当您导入 &lt;Filters&gt; 元素时,AppendChild() 必须采取措施将其保留在与其所在的相同命名空间中(即没有命名空间) - 否则,就像更改其名称一样。没有命名空间中的&lt;Filters&gt;reportdefinition 命名空间中的&lt;Filters&gt; 是不同的元素。如果 &lt;Filters&gt; 按原样附加在 &lt;DataSet&gt; 下,它将继承其新祖先 &lt;Report&gt; 的默认命名空间声明,因此其命名空间将更改为 reportdefinition 命名空间。

但是,您确实希望它位于 reportdefinition 命名空间中。最简单的方法是更改您导入的文件,使&lt;Filters&gt;已经在该命名空间中:

<Filters xmlns="http://schemas.microsoft.com/sqlserver/reporting/2005/01/reportdefinition">
  <Filter>

然后,AppendChild() 将看到 &lt;Filters&gt; 已经在其新祖先的默认命名空间中,并且不必取消声明默认命名空间。事实上,它可以删除&lt;Filters&gt; 上的默认命名空间声明,现在是多余的。

但是,我们不能保证它将删除它。关于 XML 命名空间要理解的一件重要事情是,重要的是每个元素位于哪个命名空间。使用什么 prefix 来指示该命名空间并不重要,也不管该命名空间前缀(或默认命名空间)在何处或声明多少次:只要每个元素最终在正确的命名空间。

因此,无论您导入的&lt;Filters&gt; 元素最终是否具有默认命名空间声明 (DND),对于任何合法的 XML 使用者来说都应该无关紧要。重要的是它在reportdefinition 命名空间中。如果 Microsoft RDL 处理器在 DND 上阻塞,则意味着该处理器不遵守 XML 命名空间标准。

我真的会推荐阅读有关 XML 名称空间的简短教程……尽管它们享有盛誉,但它们并没有那么复杂;当您使用标准化的 XML 词汇表时,它们几乎无处不在;并了解声明的工作原理可以为您省去很多麻烦。 This one's not short 但很好。我不能推荐 w3schools 之一,因为它混淆了前缀和命名空间。 :-p

哇,好长啊。不过,我觉得这是必要的:我们可以整天取水,但我宁愿堵住漏洞,这是由于不了解 XML 命名空间声明的工作原理造成的。

【讨论】:

  • 感谢您的及时回复。我正在为其导入 的 rdl 文件中有一个命名空间。这是一个更大的 xml 文件的 sn-p:
  • schemas.microsoft.com/sqlserver/reporting/2005/01/…" xmlns:rd="schemas.microsoft.com/SQLServer/reporting/reportdesigner"> c6a8409e-71a4-4e96-86ad -b300a5b942c3SQLData Source=10.254.230.109;Initial Catalog=BOSStrue
  • 谢谢...你能编辑你的问题并将sn-p放在那里吗?你可以更好地格式化它。你有Filters 元素及其祖先的sn-p 吗? (我得走了,会走了几个小时。)
  • 感谢您的帮助 本论坛的 XML 不能很好地剪切和粘贴
  • \n =Fields!RoleID.ValueEqual=27
猜你喜欢
  • 2013-06-11
  • 2012-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多