2012-06-25 2 views
2

Я хочу XML в формате, как:Как форматировать XML с помощью XmlWriter в C# .Net?

<?xml version="1.0" encoding="UTF-8"?> 
    <ac:Main xmlns:trip="http://www.test.com/main.xsd" 
    xmlns:abc="http://www.test.com/Types.xsd" 
    xmlns:tw="http://www.test.com/TW.xsd" 
    xmlns:ck="http://www.test.com/CK.xsd" 
    xmlns:k1="http://www.test.com/K1.xsd" 
    xmlns:d1="http://www.test.com/D1.xsd" 
    xmlns:ac="http://www.test.com/Ac.xsd" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.test.com/Ac.xsd file:/D:/schema/AC.xsd"> 
     <ac:Records> 
      <d1:Header> 
      <abc:FirstElement>firstValue</abc:FirstElement> 
     </d1:Header> 
     </ac:Records> 
    </ac:Main> 

Итак, я написал код, используя XmlWriter следующим образом:

 using (XmlWriter writer = XmlWriter.Create(path, settings)) 
     { 
      writer.WriteStartElement("ac", "Main", "xmlns"); 
      writer.WriteAttributeString("xmlns", "trip", null, http://www.test.com/main.xsd"); 
      writer.WriteAttributeString("xmlns", "abc", null, http://www.test.com/Types.xsd"); 
      writer.WriteAttributeString("xmlns", "tw", null, http://www.test.com/TW.xsd"); 
      writer.WriteAttributeString("xmlns", "kc", null, "http://www.test.com/CK.xsd"); 
      writer.WriteAttributeString("xmlns", "k1", null, "http://localhost:8080/K1.xsd"); 
      writer.WriteAttributeString("xmlns", "d1", null, "http://localhost:8080/D1.xsd");     
      writer.WriteAttributeString("xsi","schemaLocation", "http://www.w3.org/2001/XMLSchema-instance", "http://www.test.com/Ac.xsd file:/D:/schema/AC.xsd"); 

      // writer.WriteAttributeString("xmlns", "ac", null, "http://www.test.com/Ac.xsd "); 

      writer.WriteStartElement("ac", "Records", "xmlns"); 
      writer.WriteStartElement("d1", "Header", "xmlns"); 

      writer.WriteStartElement("abc", "FirstElement", "xmlns"); 
      writer.WriteString("firstValue"); 
      writer.WriteEndElement(); 
      writer.WriteEndElement(); 
      writer.WriteEndElement(); 
     } 

Но раскомментировав линии writer.WriteAttributeString ("XMLNS", "ас", null, "http://www.test.com/Ac.xsd"); дает ошибку «Префикс« ac »не может быть переопределен с« xmlns »на« http://www.test.com/Ac.xsd »в пределах одного и того же тега элемента запуска».

Итак, я commment эту строку, как показано в коде выше, и я получил выход как:

<?xml version="1.0" encoding="utf-8"?> 
    <ac:Main 
    xmlns:wctrp="http://www.test.com/main.xsd" 
    xmlns:abc="http://www.test.com/Types.xsd" 
    xmlns:tw="http://www.test.com/TW.xsd" 
    xmlns:ck="http://www.test.com/CK.xsd" 
    xmlns:k1="http://www.test.com/K1.xsd" 
    xmlns:d1="http://www.test.com/D1.xsd" 
    xmlns:ac="http://www.test.com/Ac.xsd" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.test.com/Ac.xsd file:/D:/schema/AC.xsd" 
    xmlns:ac="xmlns"> 
     <ac:Records> 
      <d1:Header xmlns:hd1="xmlns"> 
     <abc:FirstElement xmlns:iaiabc="xmlns">firstValue</abc:FirstElement> 
     </d1:Header> 
     </ac:Records> 
    </ac:Main> 

Нежелательные атрибуты объявления являются XMLNS: ас = "XMLNS" в элементе 'Main', XMLNS: hd1 = "xmlns" в 'd1: Header' и
xmlns: iaiabc = "xmlns" в 'abc: FirstElement'.

Любой любезно предложите мне, что мне следует сделать, чтобы удалить нежелательные атрибуты и получить выход в верхнем формате.

Я новичок в XmlWriter.

ответ

4

Вы неправильно используете WriteStartElement. Пространство имен не должно быть xmlns. Это должно быть фактическое пространство имен, которое вы собираетесь использовать. Кроме того, поскольку первое появление ac появляется перед написанием атрибутов, не включайте строку атрибута xmlns для ac. Атрибут xmlns для ac будет автоматически генерироваться автором.

Вы могли бы фактически исключить все строки атрибутов xmlns, но тогда пространства имен будут объявлены в первом элементе, где они происходят.

using (XmlWriter writer = XmlWriter.Create(path)) 
    { 
     writer.WriteStartElement("ac", "Main", "http://www.test.com/Ac.xsd"); 
     writer.WriteAttributeString("xmlns", "trip", null, "http://www.test.com/main.xsd"); 
     writer.WriteAttributeString("xmlns", "abc", null, "http://www.test.com/Types.xsd"); 
     writer.WriteAttributeString("xmlns", "tw", null, "http://www.test.com/TW.xsd"); 
     writer.WriteAttributeString("xmlns", "kc", null, "http://www.test.com/CK.xsd"); 
     writer.WriteAttributeString("xmlns", "k1", null, "http://localhost:8080/K1.xsd"); 
     writer.WriteAttributeString("xmlns", "d1", null, "http://localhost:8080/D1.xsd");     
     writer.WriteAttributeString("xsi","schemaLocation", "http://www.w3.org/2001/XMLSchema-instance", "http://www.test.com/Ac.xsd file:/D:/schema/AC.xsd"); 

     writer.WriteStartElement("ac", "Records", "http://www.test.com/Ac.xsd"); 
     writer.WriteStartElement("d1", "Header", "http://localhost:8080/D1.xsd"); 

     writer.WriteStartElement("abc", "FirstElement", "http://www.test.com/Types.xsd"); 
     writer.WriteString("firstValue"); 
     writer.WriteEndElement(); 
     writer.WriteEndElement(); 
     writer.WriteEndElement(); 
    } 
+0

Да, я злоупотреблял WriteStartElement. Спасибо, JamieSee, это работает для меня. – Ranzan

+0

Рад слышать, как это работает для вас. Если вы чувствуете, что это покрыло все, что вам нужно. Пожалуйста, не забудьте принять это как ответ. – JamieSee