2013-05-08 3 views
2

동일한 태그 이름과 다른 문자열을 태그 이름과 다르게 사용합니다.XMLWriter : 태그 이름을 나타내는 WriteStartElement 및 태그 이름을 나타내는 문자열

여기에 XML이 있습니다. 여기

<order> 
    <ID>1001</ID> 
    <config> 
    <properties> 
     <entry key="Total">10</entry> 
     <entry key="Name">name</entry> 
     <entry key="Config">COMMON</entry> 
     <entry key="Delivery">15-FEBRUARY-2013</entry> 
     <entry key="Setting">name</entry> 
    </properties> 
    <id>19</id> 
    </config> 
    <aID>58239346</aID> 
</order> 

내 현재 코드입니다 :

public String cards(string id) 
    { 
     StringWriter str = new StringWriter(); 
     XmlTextWriter xmlWriter = new XmlTextWriter(str); 
     xmlWriter.Formatting = Formatting.Indented; 
     xmlWriter.WriteStartDocument(); 
     xmlWriter.WriteStartElement("order"); 
     xmlWriter.WriteElementString("ID", "1001"); 
     xmlWriter.WriteStartElement("config"); 
     xmlWriter.WriteStartElement("properties"); 
     /* 
     * Create <entry key> at here 
     * 
     * 
     * 
     * 
     */ 
     xmlWriter.WriteEndElement(); 
     xmlWriter.WriteEndElement(); 
     xmlWriter.WriteElementString("ClientID", id); 
     xmlWriter.WriteEndElement(); 
     xmlWriter.WriteEndDocument(); 
     xmlWriter.Flush(); 
     xmlWriter.Close(); 
     return str.ToString(); 
    } 

방법 XMLWriter가에 대한 항목 태그를 작성하는 ??? 나는 그것을 쓰는 방법을 모른다.

답변

6

질문은 <entry> 태그에 관한 것 같습니다. 즉, 기본적으로 유사 5 개 블록의 연속이다, 당신은 또한 XmlSerializer에서 볼 수도 있습니다 그러나

xw.WriteStartElement("entry"); 
xw.WriteAttributeString("key", "RecordTotal"); 
xw.WriteString("10"); 
xw.WriteEndElement(); 

- 아마이 만들 수있는 많은 쉽게 :

using System; 
using System.Collections.Generic; 
using System.Xml.Serialization; 

static class Program { 
    static void Main() { 
     var order = new Order { 
      ClientId = 1001, 
      Id = 58239346, 
      Config = new OrderConfig { 
       Id = 19, 
       Properties = { 
        new OrderProperty { Key = "RecordTotal", Value = "10"}, 
        new OrderProperty { Key = "InputFileName", Value = "name"}, 
        new OrderProperty { Key = "ConfigName", Value = "COMMON_"}, 
        new OrderProperty { Key = "DeliveryDate", Value = "15-FEBRUARY-2013"}, 
        new OrderProperty { Key = "Qualifier", Value = "name"} 
       } 
      } 
     }; 
     var ser = new XmlSerializer(typeof(Order)); 
     ser.Serialize(Console.Out, order); 
    } 
} 
[XmlRoot("order")] 
public class Order { 
    [XmlElement("clientID", Order = 0)] 
    public int ClientId { get; set; }  
    [XmlElement("config", Order = 1)] 
    public OrderConfig Config { get; set; }  
    [XmlElement("orderID", Order = 2)] 
    public int Id { get; set; } 
} 

public class OrderConfig { 
    [XmlElement("id", Order = 2)] 
    public int Id { get; set; }  
    private readonly List<OrderProperty> properties = new List<OrderProperty>(); 
    [XmlArray("properties", Order = 1), XmlArrayItem("entry")] 
    public List<OrderProperty> Properties { get { return properties; } } 
} 

public class OrderProperty { 
    [XmlAttribute("key")] 
    public string Key {get;set;} 
    [XmlText] 
    public string Value {get;set;} 
} 
+0

@kingjia 전체'XmlSerializer' 예제를 추가했습니다. FYI –

1

각이 시도 항목 :

xmlWriter.WriteStartElement("entry"); 
xmlWriter.WriteAttributeString("key", "RecordTotal"); 
xmlWriter.WriteValue(10); 
xmlWriter.WriteEndElement(); 
0

당신은 새로운 항목의 아래에 시도 할 수 :

xmlWriter.WriteStartElement("entry"); 
xmlWriter.WriteAttributeString("key", "RecordTotal"); 
xmlWriter.WriteValue(10); 
xmlWriter.WriteEndElement(); 

XML Serizalizer를 참조하십시오. 다음은이에 관해서 코드 예제는 다음과 같습니다

 try 
     { 
      XmlSerializer serializer = new XmlSerializer(typeof(T)); 
      StringWriter writer = new StringWriter(); 
      serializer.Serialize(writer, myClass); 

      StringBuilder sb = new StringBuilder(writer.ToString()); 
              return sb.ToString(); 
     } 
     catch (Exception ex) 
     { 
      throw new System.Exception("Class To XML Error: " + ex.Message); 
     } 
+0

거기에 XML_HEADER_FILTER가 무엇입니까? 그것이 중복 된 네임 스페이스 선언을 제거하는 것이라면, 그것들을 포함하지 말도록 요청할 수 있습니다. –

+0

@MarcGravell XML_HEADER_FILTER 코드 줄을 제거했습니다. 이것은 여전히 ​​문제없이 빌드됩니다. 나는 이것을 내 자신의 코드 조각에서 지켰다. 사과한다. – Sean

+0

그러나 당신의 정보를 위해서 - 만약'xmlns' 항목을 지우려면'XmlSerializer'가 그들을 생략하도록 지시 할 수 있습니다; 이 질문에 대한 나의 예를 살펴보면 마지막 줄을 다음과 같이 변경한다 :'var ns = new XmlSerializerNamespaces(); ns.Add ("", ""); ser.Serialize (Console.Out, order, ns);'- xmlns' 엔트리가 출력되지 않습니다. –

3

나는 이것에 대한 Linq에 - 투 - XML을 사용하도록 유혹 할 것 : 여러 속성 요소를 원하는 경우, 비교로서

using System; 
using System.Xml.Linq; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main() 
     { 
      XElement root = 
       new XElement("order", 
        new XElement("clientId", 1001), 
        new XElement("config", 
         new XElement("properties", 
          new XElement("entry", new XAttribute("key", "RecordTotal"), 10), 
          new XElement("entry", new XAttribute("key", "InputFileName"), "name"), 
          new XElement("entry", new XAttribute("key", "ConfigName"), "COMMON"), 
          new XElement("entry", new XAttribute("key", "DeliveryDate"), "15-FEBRUARY-2013"), 
          new XElement("entry", new XAttribute("key", "Qualifier"), "name")), 
         new XElement("id", 19)), 
        new XElement("orderID", 58239346) 
      ); 

      Console.WriteLine(root); 
     } 
    } 
} 

그래서 XML은 다음과 같이 보았다 :

<order> 
    <clientId>1001</clientId> 
    <config> 
    <properties> 
     <property> 
     <entry key="RecordTotal">10</entry> 
     <entry key="InputFileName">name</entry> 
     <entry key="ConfigName">COMMON</entry> 
     <entry key="DeliveryDate">15-FEBRUARY-2013</entry> 
     <entry key="Qualifier">name</entry> 
     </property> 
     <property> 
     <entry key="RecordTotal">15</entry> 
     <entry key="InputFileName">othername</entry> 
     <entry key="ConfigName">UNCOMMON</entry> 
     <entry key="DeliveryDate">23-FEBRUARY-2013</entry> 
     <entry key="Qualifier">qname</entry> 
     </property> 
    </properties> 
    <id>19</id> 
    </config> 
    <orderID>58239346</orderID> 
</order> 

과 같이 할 수 코드 :

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Xml.Linq; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main() 
     { 
      XElement root = 
       new XElement("order", 
        new XElement("clientId", 1001), 
        new XElement("config", 
         new XElement("properties", 
          createEntries(getEntries())), 
         new XElement("id", 19)), 
        new XElement("orderID", 58239346) 
      ); 

      Console.WriteLine(root); 
     } 

     static IEnumerable<Entry> getEntries() 
     { 
      yield return new Entry 
      { 
       RecordTotal = 10, 
       InputFileName = "name", 
       ConfigName = "COMMON", 
       DeliveryDate = "15-FEBRUARY-2013", 
       Qualifier  = "name" 
      }; 

      yield return new Entry 
      { 
       RecordTotal = 15, 
       InputFileName = "othername", 
       ConfigName = "UNCOMMON", 
       DeliveryDate = "23-FEBRUARY-2013", 
       Qualifier  = "qname" 
      }; 
     } 

     static IEnumerable<XElement> createEntries(IEnumerable<Entry> entries) 
     { 
      return from entry in entries 
        select new XElement(
         "property", 
         new XElement("entry", new XAttribute("key", "RecordTotal"), entry.RecordTotal), 
         new XElement("entry", new XAttribute("key", "InputFileName"), entry.InputFileName), 
         new XElement("entry", new XAttribute("key", "ConfigName"), entry.ConfigName), 
         new XElement("entry", new XAttribute("key", "DeliveryDate"), entry.DeliveryDate), 
         new XElement("entry", new XAttribute("key", "Qualifier"),  entry.Qualifier)); 
     } 
    } 

    sealed class Entry 
    { 
     public int RecordTotal; 
     public string InputFileName; 
     public string ConfigName; 
     public string DeliveryDate; 
     public string Qualifier; 
    } 
} 
관련 문제