2

次のような形式の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>

不要な属性は、要素「Main」のxmlns:ac = "xmlns"、「d1:Header」のxmlns:hd1 = "xmlns"、および
「abc:FirstElement」のxmlns:iaiabc="xmlns"です。

不要な属性を削除し、出力を最上位の形式で取得するには、どうすればよいかを教えてください。

XmlWriterは初めてです。

4

1 に答える 1

4

WriteStartElement を誤用しています。名前空間は xmlns であってはなりません。これは、使用する実際の名前空間であるはずです。また、ac の最初の出現は属性が書き込まれる前に来るため、ac の xmlns 属性行を含めないでください。ac の xmlns 属性は、ライターによって自動的に生成されます。

実際にはすべての 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(); 
    }
于 2012-06-25T17:11:41.607 に答える