2015-05-10 4 views
0

Я написал программу для создания XML-документа из excel, но выводит следующий формат (обратите внимание на xmls = "" на узлах ключа и значения (я не хочу этого))Удалить пространства имен из узлов xml

<?xml version="1.0" encoding="utf-8"?> 
<Content xmlns="uuid:5c2dffe6-cf72-4211-a8a0-dc6a7baf3ff1"> 
    <Redirect xmlns="xmlns:xlink=http://www.w3.org/1999/xlink"> 
    <key xmlns="">/*$0*/</key> 
    <value xmlns="">/</value> 
    </Redirect> 
    <Redirect xmlns="xmlns:xlink=http://www.w3.org/1999/xlink"> 
    <key xmlns="">/2014-12-22</key> 
    <value xmlns="">/</value> 
    </Redirect> 
    <Redirect xmlns="xmlns:xlink=http://www.w3.org/1999/xlink"> 
    <key xmlns="">/a</key> 
    <value xmlns="">/</value> 
    </Redirect> 
</Content> 

желаемого уведомление формата ключ и значение узлы не имеют Xmlns = ""

<Content xmlns="uuid:5c2dffe6-cf72-4211-a8a0-dc6a7baf3ff1"> 
    <Redirect xmlns="xmlns:xlink=http://www.w3.org/1999/xlink"> 
    <key>/*$0*/</key> 
    <value>/</value> 
    </Redirect> 
    <Redirect xmlns="xmlns:xlink=http://www.w3.org/1999/xlink"> 
    <key>/2014-12-22</key> 
    <value>/</value> 
    </Redirect> 
    <Redirect xmlns="xmlns:xlink=http://www.w3.org/1999/xlink"> 
    <key>/a</key> 
    <value>/</value> 
    </Redirect> 
</Content> 

мой код

private void btnUpload_Click(object sender, EventArgs e) 
{ 
    if (lblFileUploaded.Text != "No_File_has_been_uploaded") 
    { 

     if (ddlHostName.SelectedIndex == -1) 
     { 
      MessageBox.Show("please_select_a_host_name"); 

     } 
     else 
     { 
      var hostName = ddlHostName.SelectedItem.ToString(); 
      //"Content" + "xmlns=\"uuid:5c2dffe6-cf72-4211-a8a0-dc6a7baf3ff1\"" 

      XNamespace ns = "uuid:5c2dffe6-cf72-4211-a8a0-dc6a7baf3ff1"; 
      var rootNode = new XElement(ns + "Content"); 

      var processedUrls = new HashSet<string>(); 

      //select the file thats been uploaded 

      var file = new FileInfo(openFileDialog1.FileName); 

      if (!file.Exists) 
      { 
       return; 
      } 

      if (file.Extension != ".xlsx") 
      { 
       lblFileUploaded.Text = "ERROR__File_format_invalid"; 
       return; 
      } 

      using (var package = new ExcelPackage(file)) 
      { 
       var workbook = package.Workbook; 
       var sheet = workbook.Worksheets[1]; 

       int lastRow = sheet.Dimension.End.Row; 

       //loop through the xsls rows of data 
       for (int i = 2; i < lastRow; i++) 
       { 
        var oldUrl = sheet.Cells[i, 1].Text.Trim(); 
        var newUrl = sheet.Cells[i, 2].Text.Trim(); 

        if (string.IsNullOrWhiteSpace(oldUrl) || string.IsNullOrWhiteSpace(newUrl) || processedUrls.Contains(oldUrl)) 
         continue; 

        processedUrls.Add(oldUrl); 

        XNamespace ns2 = "xmlns:xlink=" + "http://www.w3.org/1999/xlink"; 
        var urlChildNode = new XElement(ns2 + "Redirect"); 
        rootNode.Add(urlChildNode); 

        var urlOldNode = new XElement("key", oldUrl.Replace(hostName, "")); 
        urlChildNode.Add(urlOldNode); 

        if (newUrl.Equals(hostName + "/")) 
        { 
         var urlNewNode = new XElement("value", newUrl.Replace(hostName + "/", "/")); 
         urlChildNode.Add(urlNewNode); 
        } 

        else if (newUrl.Equals(hostName)) 
        { 
         var urlNewNode = new XElement("value", newUrl.Replace(hostName, "/")); 
         urlChildNode.Add(urlNewNode); 
        } 

        else if (newUrl.Equals("www.aircharterservice.com")) 
        { 
         var urlNewNode = new XElement("value", newUrl.Replace("www.aircharterservice.com", "/")); 
         urlChildNode.Add(urlNewNode); 
        } 

        else 
        { 
         var urlNewNode = new XElement("value", newUrl.Replace(hostName, "")); 
         urlChildNode.Add(urlNewNode); 
        } 

       } 
      } 

На данный момент я изо всех сил пытаюсь понять, как я могу удалить ненужное пространство имен

+0

'' key "' -> 'ns2 +" key "', '" value "' -> 'ns2 +" value "'. – PetSerAl

+0

Удивительная работала, спасибо вам большое. Больше не использовать find и replace теперь у меня есть решение. Не могли бы вы объяснить, как это работает? – Paul

ответ

0

Детские элементы наследуют пространство имен по умолчанию от родителя. Таким образом, этот XML-код:

<parent xmlns="Namespace"> 
    <child /> 
</parent> 

эквивалентно:

<parent xmlns="Namespace"> 
    <child xmlns="Namespace" /> 
</parent> 

но не:

<parent xmlns="Namespace"> 
    <child xmlns="" /> 
</parent> 

Таким образом, если вы хотите удалить xmlns="" атрибут из child элемента, то есть положить child элемент в том же пространстве имен, что и parent, но не пустым пространством имен.

+0

Отличное спасибо – Paul

0

спасибо за помощь, приведенную ниже, помогли мне решить проблему.

XNamespace ns2 = "xmlns:xlink=" + "http://www.w3.org/1999/xlink"; 
var urlChildNode = new XElement(ns2 + "Redirect"); 
rootNode.Add(urlChildNode); 

var urlOldNode = new XElement(ns2 + "key", oldUrl.Replace(hostName, "")); 
urlChildNode.Add(urlOldNode); 

if (newUrl.Equals(hostName + "/")) 
{ 
    var urlNewNode = new XElement(ns2 + "value", newUrl.Replace(hostName + "/", "/")); 
    urlChildNode.Add(urlNewNode); 
} 

else if (newUrl.Equals(hostName)) 
{ 
    var urlNewNode = new XElement(ns2 + "value", newUrl.Replace(hostName, "/")); 
    urlChildNode.Add(urlNewNode); 
} 

else if (newUrl.Equals("www.aircharterservice.com")) 
{ 
    var urlNewNode = new XElement(ns2 + "value", newUrl.Replace("www.aircharterservice.com", "/")); 
    urlChildNode.Add(urlNewNode); 
} 

else 
{ 
    var urlNewNode = new XElement(ns2 + "value", newUrl.Replace(hostName, "")); 
    urlChildNode.Add(urlNewNode); 
} 
+0

Пространство имен 'xlink' почти наверняка неверно. Вероятно, у него не должно быть 'xmlns: xlink =' как части пространства имен. –

+0

Привет, Джон, спасибо за ваш вклад. Я просто попросил создать небольшую программу, которая создала бы XML-документ на основе указанного выше формата, и теперь у меня есть это :) – Paul

+0

Нет, я думаю, что вы неправильно читали формат. Пожалуйста, смотрите внимательно. Поиск по [so] для «xlink xmlns» для многих примеров правильного пространства имен. –

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