2010-08-04 6 views
1

내 코드에이 코드를 사용하면 xml 파일로 완벽하게 출력되지만 요소 중 하나에만 요소 이름 뒤에 '='기호가 추가됩니다. 속성.XmlWriter - 속성 읽기 (빠른 질문)

은 내가

if(reader.Getattribute != "") 
// I made that up on the spot, I'm not sure if that would really work 
{ 
     Console.WriteLine("<{0} = {1}>", reader.Name, reader.GetAttribute("name")); 
} 

else 
{ 
     Console.WriteLine("<{0}>", reader.Name); 
} 

같은 뭔가를 할 수 있지만 코딩하는 청소기 방법이 생각? (해결없이)

내 코드이 줄

case XmlNodeType.Element: 
     Console.WriteLine("<{0} = {1}>", reader.Name, reader.GetAttribute("name")); 
     break; 

때문에

using System; 
using System.Xml; 
using System.IO; 
using System.Text; 

public class MainClass 
{ 
    private static void Main() 
    { 
     XmlWriterSettings settings = new XmlWriterSettings(); 

     settings.Indent = true; 


     XmlWriter w = XmlWriter.Create(@"Path\test.xml", settings); 



     w.WriteStartDocument(); 
     w.WriteStartElement("classes"); 

     w.WriteStartElement("class"); 
     w.WriteAttributeString("name", "EE 999"); 
     w.WriteElementString("Class_Name", "Programming"); 
     w.WriteElementString("Teacher", "James"); 
     w.WriteElementString("Room_Number", "333"); 
     w.WriteElementString("ID", "2324324"); 
     w.WriteEndElement(); 




     w.WriteEndDocument(); 
     w.Flush(); 
     w.Close(); 




     XmlReader reader = XmlReader.Create(@"Path\test.xml"); 

     while (reader.Read()) 
     { 
      switch (reader.NodeType) 
      { 
       case XmlNodeType.Element: 
        Console.WriteLine("<{0} = {1}>", reader.Name, reader.GetAttribute("name")); 
        break; 
       case XmlNodeType.Text: 
        Console.WriteLine(reader.Value); 
        break; 
       case XmlNodeType.CDATA: 
        Console.WriteLine("<[CDATA[{0}]>", reader.Value); 
        break; 
       case XmlNodeType.ProcessingInstruction: 
        Console.WriteLine("<?{0} {1}?>", reader.Name, reader.Value); 
        break; 
       case XmlNodeType.Comment: 
        Console.WriteLine("<!--{0}-->", reader.Value); 
        break; 
       case XmlNodeType.XmlDeclaration: 
        Console.WriteLine("<?xml version='1.0'?>"); 
        break; 
       case XmlNodeType.Document: 
        break; 
       case XmlNodeType.DocumentType: 
        Console.WriteLine("<!DOCTYPE {0} [{1}]", reader.Name, reader.Value); 
        break; 
       case XmlNodeType.EntityReference: 
        Console.WriteLine(reader.Name); 
        break; 
       case XmlNodeType.EndElement: 
        Console.WriteLine("</{0}>", reader.Name); 
        break; 
      } 
     } 
    } 
} 

출력

<?xml version='1.0'?> 
<classes = > 
<class = EE 999> 
<Class_Name = > 
Programming 
</Class_Name> 
<Teacher = > 
James 
</Teacher> 
<Room_Number = > 
333 
</Room_Number> 
<ID = > 
2324324 
</ID> 
</class> 
</classes> 

답변

1

는 항상 '='확인하지 않고 기록합니다.

거친 수정 :

case XmlNodeType.Element: 
     Console.WriteLine("<{0}", reader.Name); 
     if (reader.HasAttributes) 
      // Write out attributes 
     Console.WriteLine(">"); 
     break; 

그런데 왜 당신은 전혀 XmlReader를 사용하고 있습니까? 그것은 거추장스럽고 거대한 XML 스트림을 다룰 때만 유용합니다. 당신의 데이터 세트 >> 10메가바이트 다음하여 XDocument 보거나 된 XmlDocument을하지 않는 경우

당신의 예에서 XmlWriter를가 (거친 약)로 대체 될 수

: 여기

// using System.Xml.Linq; 

     var root = new XElement("classes", 
      new XElement("class", new XAttribute("name", "EE 999"), 
       new XElement("Class_Name", "Programming"), 
       new XElement("Teacher", "James") 
       )); 

     root.Save(@"Path\test.xml"); 

    var doc = XDocument.Load(@"Path\test.xml"); 
    // doc is now an in-memory tree of XElement objects 
    // that you can navigate and query 

그리고는 an intro입니다

+0

어떻게 속성이 거기 있는지 확인 뭔가를 포함하는 그 진술을 편집해야합니까? – superlazyname

+0

XDocument 또는 XmlDocument를 사용하는 방법을 모르겠습니다. 가장 잘 알고있는 XML을 읽고 쓰는 방법을 선택했습니다. 좋은 튜토리얼을 가지고 있다면, 내가 살펴볼 것이다. 이 방법은 번거로운 것처럼 보입니다. – superlazyname

+0

나는 이것을 사용하려고 생각했지만, 많은 용어를 사용하는데 (var, foreach, in, from) 매우 익숙하지 않다. 나는 내가 나중에 그것을 볼 수 있었다고 생각한다. – superlazyname

0

당신이 성취하려고하는 것이 정확히 무엇인지 모르지만 개인적으로 하위 요소를 식별하는 속성으로 클래스 요소를 나타내는 .NET 클래스를 만들고 System.Xml.Serialization.XmlSerializer를 사용하여 작성하거나 읽습니다. 파일에서. 여기

은 예입니다

using System.Xml.Serialization; 

public class MyClasses : List<MyClass>{}  

public class MyClass{ 
public String Teacher{ get; set; } 
} 

void main(){ 
    MyClasses classList = new MyClasses(); 

    MyClass c = new MyClass(); 
    c.Teacher = "James"; 

    classList.Add(c); 

    XmlSerializer serializer = new XmlSerializer(classList.GetType()); 
    serializer.Serialize(/*Put your stream here*/); 
} 

그리고, 독자에게 연습으로 스트림을 설정 떠난 후, blamo, 당신은 어떤 스트림에 개체의 XML 표현을하고 출력하기 완료됩니다. 스트림은 파일, 문자열이 될 수 있습니다. 죄송합니다 불쾌한 C#을 (그 불쾌한 경우) 나는 VB.NET을 매일 사용하므로 구문과 키워드가 약간있을 수 있습니다.

업데이트
클래스 컬렉션을 직렬화하는 방법을 보여주기 위해 몇 가지 코드를 추가했습니다. 노드가 정확하게 명명되지 않은 경우 클래스 속성에 추가 할 수있는 속성이 있습니다. 단지 빠른 google을 사용하십시오.

업데이트 우리가 다른 두 가지 의미로 같은 단어를 사용할 때 설명하기 하드 다시
죄송합니다. 벽돌 한 덩어리를 표현하려고합니다. Brick이라는 C# 클래스를 만들고 이라는에서 상속받은 C# 클래스 Brick에는 Color이라는 속성이 있습니다. 그런 다음 모든 색상으로 모든 벽돌을 만들고 벽돌로 양동이를 채 웁니다.그럼 당신은 직렬로 버킷을 통과 것이며, 그것은 당신에게 같은 줄 것이다 : 당신이 세부 사항에 대해 걱정할 필요가 없습니다

<Bucket>  
    <Brick> 
    <Color>  
     blue  
    </Color> 
    </Brick> 
</Bucket> 

시리얼 라이저는 수업의 정의에서 당신을 위해 XML을 기반으로합니다. 당신은에 대한 자세한 내용을보실 수 있습니다 herehere

+0

나는 (학교에서가 아닌 프로그래밍 클래스처럼, 즉, 각각의 클래스를 나타내는), 여러 노드를 만들려고 노력하고있어, 각각의 노드는 등 I 돈을 교사의 이름, 방 번호, 등의 요소가 당신이 제안한 것이 데이터를 그러한 종류의 구조로 구성하는 방법을 알 수 없습니다. – superlazyname

+0

또한 "클래스"의 목록을 나타내는 클래스를 만들 수 있습니다 (목록 생각) 당신이 당신의 "클래스"를 나타 내기 위해 만든 클래스의 각 인스턴스를 입력 한 후 시리얼 라이저에 대한 목록을 전달합니다. 이 루트 객체이고 그 아래에 개의 노드가 있어야합니다. – Justin

+0

<참고 : 용어> 나는 ' "클래스"'나는 당신이 학교에 참석 뭔가 말하는 겁니다 말할 때. 내가 'class'라고 말할 때 나는 프로그래밍 클래스를 언급하고 있습니다. 그래서 당신은 내가 모든 "클래스"를 포함하는 클래스를 만들고, 각 "클래스"일부 클래스의 인스턴스를해야 말을하는지? 어떤 수업? 또한 serializer는 무엇을합니까? – superlazyname