2010-11-15 3 views
-1

Вот фрагмент моего кода.Как я могу предотвратить appendChild() от добавления xmlns = ""

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:

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

Далее вниз в этом файле после <Query>, мне нужно объединить в <Filters>

Вот этот файл:

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

заканчивается <Filters xmlns=""> вместо <Filters>

Благодарности

+1

Я не уверен, что вы спрашиваете, не могли бы вы привести в порядок вопрос и привести пример того, что вы получаете и что хотите? –

+0

его довольно просто. У меня есть файл, содержащий XML для фильтра, и я хочу объединить его в другой XML-файл (отчет rdl).Я нашел, что могу это сделать, но когда AppendChild добавляет узел, он добавляет атрибут xmlns = "", который затем заканчивается как Я просто не хочу xmlns = "". – Lyle

ответ

2

Вы должны показать нам образцы XML двух файлов, которые вы пытаетесь объединить.

Что, вероятно, происходит в том, что в первом файле reportrdl элементы DataSet находятся под объявлением пространства имен по умолчанию, отличным от «". Поэтому каждый элемент под ними, который не имеет префикса пространства имен и не переопределяет декларацию пространства имен по умолчанию, будет находиться в пространстве имен по умолчанию, объявленном его предком.

Но вы импортируете элементы Filters, которые не находятся в этом пространстве имен, и не имеют префикса. Следовательно, , чтобы предотвратить их наследование пространства имен по умолчанию, которое не относится к ним, им необходимо удешевить пространство имен по умолчанию, которое выполняется с использованием xmlns="".

Если это не так, просьба предоставить образцы двух документов XML, поэтому мы не пытаемся делать операцию в темноте.

Если выше является дело, вопрос к вам есть, почему вы не хотите, xmlns="" на выходе? Похоже, это правильный результат. Но, возможно, вы не хотите его, потому что хотите, чтобы импортированный элемент Filters находился в том же пространстве имен, что и его родительский; в этом случае вам необходимо изменить пространство имен imported. Затем последуют объявления пространств имен.

Возможно, вы хотите, чтобы импортированный узел не был в пространстве имен, поэтому выход технически корректен, но вам не нравится эстетика xmlns="". Или, может быть, есть нисходящий XML-потребитель, который почему-то задыхается от xmlns="". Расскажите подробнее о своих ограничениях, чтобы мы могли знать, как помочь.

Update:

Хорошо, теперь мы знаем, что

  • Элементы в первом файле находятся в пространстве имен ReportDefinition, чей URL является "http://schemas.microsoft.com/sqlserver/reporting/2009/01/reportdefinition". Мы можем сказать, потому что элемент верхнего уровня, <Report>, имеет на нем объявление пространства имен по умолчанию: xmlns="http://schemas.microsoft.com.../reportdefinition". Это означает, что для <Report> и всех потомков любой элемент без префикса пространства имен считается находящимся в пространстве имен reportdefinition.
  • Элементы в импортированном файле, такие как <Filters>должны быть в том же пространстве имен отчетов. Я делаю это с MS documentation, хотя это не ясно. Большая часть этой документации, к сожалению, ужасная ... полная ill-formed XML даже!
  • Однако импортированный элемент и его потомки фактически не имеют пространства имен (перед импортом их), потому что у них нет префикса пространства имен и нет объявления пространства имен по умолчанию.

Так что, когда вы импортируете <Filters> элемент, AppendChild() должен действовать, чтобы сохранить его в том же пространстве имен, что это в (т.е. не имен) - в противном случае было бы, меняет свое название. <Filters> в пространстве имен не является другим элементом от <Filters> в пространстве имен reportdefinition. Если были добавлены под именем <DataSet> as-is, он наследовал бы декларацию пространства имен по умолчанию от своего нового предка <Report> и, таким образом, его пространство имен было бы изменено на пространство имен Reportdefinition.

Однако вы, , должны хотите, чтобы оно находилось в пространстве имен отчета. Самый простой способ сделать это, чтобы изменить импортированный файл так что <Filters> является уже в этом пространстве имен:

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

Затем AppendChild() будет видеть, что <Filters> уже в пространстве имен по умолчанию своего нового предков, и не нужно будет указывать пространство имен по умолчанию. Фактически, он может удалить декларацию пространства имен по умолчанию на <Filters>, который теперь является избыточным.

Однако гарантия что бы удалить его. Одна важная вещь для понимания пространств имен XML состоит в том, что имеет значение какое пространство имен для каждого элемента находится в. Неважно, какой префикс используется для указания того пространства имен и не имеет значения, где и сколько раз этот префикс пространства имен (или пространство имен по умолчанию) объявляется: до тех пор, пока каждый элемент окажется в правом пространстве имен.

Так ли ваш импортированный элемент <Filters> заканчивается тем, что имеет объявление об объявлении пространства имен по умолчанию (DND) или нет не должно иметь значения любому законному потребителю XML. Все, что имеет значение, это то, что оно находится в пространстве имен Reportdefinition. Если процессор Microsoft RDL дросселирует DND, это означает, что процессор не придерживается стандартов пространства имен XML.

Я бы рекомендовал прочитать короткий учебник по пространствам имен XML ... Они не так уж сложны, несмотря на их репутацию; они почти повсеместны, когда вы работаете со стандартизованными XML-словарями; и понимание того, как работа декларации может сэкономить вам много головной боли. This one's not short, но это хорошо. Я не могу рекомендовать w3schools, потому что он смущает префиксы пространствами имен. :-p

Ничего себе, это получилось длинным. Я чувствовал, что это необходимо, хотя: мы можем запирать воду весь день, но я предпочел бы подключить утечку, что вызвано не пониманием того, как работают объявления пространства имен XML.

+0

Спасибо за быстрый ответ. У меня есть пространство имен в файле rdl, в котором я импортирую . Вот фрагмент файла с большим размером xml: – Lyle

+0

<е: DataSourceID> c6a8409e-71a4-4e96-86ad-b300a5b942c3 SQL Data Source = 10.254.230.109; Initial Catalog = BOSS True Lyle

+0

Спасибо ... Может вы редактируете лет ур вопрос и поставить там фрагмент? Вы можете отформатировать его намного лучше. У вас есть фрагмент для элемента «Фильтры» и его предков? (Я должен идти, не будет в течение нескольких часов.) – LarsH

Смежные вопросы