【问题标题】:How to format XML using XmlWriter in C#.Net?如何在 C#.Net 中使用 XmlWriter 格式化 XML?
【发布时间】:2012-06-25 15:34:41
【问题描述】:

我想要格式如下的 XML:

  <?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", "ac", null, "http://www.test.com/Ac.xsd"); 产生错误 “前缀 'ac' 不能在同一个起始元素标记中从 'xmlns' 重新定义为 'http://www.test.com/Ac.xsd'。”

所以,我注释了上面代码所示的那一行,我得到的输出是:

 <?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:ac="xmlns" 在元素'Main'中, 'd1:Header' 中的 xmlns:hd1="xmlns" 和
'abc:FirstElement' 中的 xmlns:iaiabc="xmlns"。

任何人都好心地建议我应该怎么做才能删除不需要的属性并以最高格式获得输出。

我是 XmlWriter 的新手。

【问题讨论】:

    标签: c# xml xmlwriter


    【解决方案1】:

    您误用了 WriteStartElement。命名空间不应该是 xmlns。它应该是您要使用的实际命名空间。此外,因为 ac 的第一次出现出现在属性写入之前,所以不要为 ac 包含 xmlns 属性行。 ac 的 xmlns 属性将由 writer 自动生成。

    您实际上可以省略所有 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(); 
        }
    

    【讨论】:

    • 是的,我误用了 WriteStartElement。谢谢 JamieSee,它对我有用。
    • 很高兴听到它对您有用。如果你觉得这已经涵盖了你需要的一切。请务必接受这个作为答案。
    猜你喜欢
    • 1970-01-01
    • 2014-08-21
    • 1970-01-01
    • 2011-02-09
    • 2010-11-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多