2012-06-25 3 views
2

내가 같은 형식으로 XML을 원하는 :C# .NET에서 XmlWriter를 사용하여 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", "교류" null, "http://www.test.com/Ac.xsd"); 오류 "접두사 'ac'는 'xmlns'에서 'http://www.test.com/Ac.xsd'로 동일한 시작 요소 태그 내에서 재정의 할 수 없습니다." 원치 않는 attibutes이 의 xmlns 있습니다

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

: AC = "XMLNS"요소 '홈페이지', 의 xmlns : 위의 코드와 같이 내가 같은 출력을 가지고로

그래서, 그 라인을 commment HD1을 = "xmlns"in 'd1 : Header'이고
xmlns : iaiabc = "xmlns"in 'abc : FirstElement'.

원하지 않는 속성을 제거하고 출력을 최상위 형식으로 가져 오려면 무엇을해야하는지 친절하게 제안합니다.

저는 XmlWriter를 처음 사용합니다.

답변

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(); 
    } 
+0

예, WriteStartElement를 잘못 사용했습니다. Jamie 감사합니다, 저를 위해서 일합니다. – Ranzan

+0

다행히 듣고 다행입니다. 이것이 당신이 필요로하는 모든 것을 다뤘다 고 생각한다면. 이것을 대답으로 받아 들여야합니다. – JamieSee

관련 문제