2011-07-06 8 views
2

단추를 사용하여 파일을 생성하는 C# 응용 프로그램이 있습니다. 현재 C#을 사용하여 XML 파일의 내용을 추출하여 문자열로 전달하려고합니다. 예를 들어 내 XML 파일에서 태그 이름이 있습니다. XML 파일에서 이름을 추출하려면 C#을 사용하고 싶습니다. 그것을 달성하려면 어떻게해야합니까? 아래는 현재 가지고있는 샘플 코드입니다. 단추 클릭을 사용하여 전체 프로세스를 수행해야합니다.XML 파일의 내용 추출

private void button1_Click(object sender, EventArgs e) 
{ 
    XElement xml = XElement.Load("C:\\Windows 7.xml"); 
    IEnumerable<XElement> propertyIDs = xml.Descendants("PropertyId"); 

    foreach (XElement child in xml.Elements()) 
    { 
     XElement row = child.Element("my:VM_Name"); 
     string test = xml.ToString(); 
     Console.WriteLine(test); 
    }  
} 

내 xml 파일을 보려면이 링크에 액세스하십시오 : 당신이 당신의 질문에 추가 http://pastebin.com/NKhBb4Zh

+0

코드는 꽤 좋아 보인다. 나는 그 질문을 이해하지 못한다. 'foreach' 루프의 몸체에서 당신이 원하는 것은 무엇입니까? –

+0

당신은 무엇을하려고합니까? 예외가 있습니까? 무엇이 옳지 않은가? – Tipx

+0

@Kirk Woll, Console.WriteLine (xml.Value) 사용; 내용을 내 xml 파일에 표시 할 수 있습니다.각 요소의 내용을 추출하여 C#의 문자열로 전달하려고합니다. – dwyane

답변

2

나는 XmlDocument 클래스를 사용하기 위해 예제를 다시 작성했다. 네임 스페이스가 있으므로 네임 스페이스 관리자을 추가해야했습니다. 이것을 사용하여 spefic 노드를 선택할 수도 있습니다.

 string url = @"e:\temp\data.xml"; 

     XmlDocument doc = new System.Xml.XmlDocument(); 
     doc.Load(url); 
     XmlElement docElement = doc.DocumentElement; 

     /// loop through all childNodes 
     foreach (XmlNode childNode in docElement.ChildNodes) 
     { 
      Console.WriteLine(childNode.Name + ": " + childNode.InnerText); 
     } 

     XmlNamespaceManager mgr = new XmlNamespaceManager(doc.NameTable); 
     mgr.AddNamespace("my", "http://schemas.microsoft.com/office/infopath/2003/myXSD/2011-05-27T03:57:48"); 

     /// use the given XmlNamespaceManager to select a specific element 
     XmlNode node = docElement.SelectSingleNode("my:VM_DiskSize", mgr); 
     /// use innerText for node text and value for attributes only 
     Console.WriteLine("\n" + node.Name + ": " + node.InnerText); 

HTH

+0

Console.WriteLine ("\ n"+ node.Name + ":"+ node.InnerText); 나에게 오류를주고있다. NullException – dwyane

+0

아 아프다 - 지금 다시 시도하십시오 - 복사 & 붙여 넣기 오류 –

+0

네임 스페이스에 맞춤법 오류가 있습니다. 내 코드를 복사하고 시도하십시오. 이제는 double track를 추가하는 방법을 알고 있습니까? –

1

발언은 매우 도움이되었다. 특히 :

이 코드 추가 :

XElement name = xml.Element("my:VM_Name"); 
string test = xml.ToString(); 
Console.WriteLine(test); 

을하지만 난 여전히 XML 태그

에서 Windows 7을 추출 할 수 없습니다 오전 :

이 오류가 발생합니다. ':'문자 cter, 16 진수 값 0x3A는 이름에 포함될 수 없습니다.

먼저 오류부터 시작해 보겠습니다. 완료 한 후 메소드에 ns:name 쌍을 전달할 수 없습니다. 이 API를 사용하면 네임 스페이스 (ns)는 프로그래밍 방식으로 XName 유형을 통해 제공되어야합니다. 그래서 그 대신, 그 라인 읽어야는 유래로

XElement name = xml.Element(XName.Get("VM_Name", "my")); 

는 여기에서 우리는 콜론으로 구분 된 문자열로 실제 XName으로 정규화 된 이름을 통과하지. 순서에주의를 기울이십시오; 이 구문을 사용하면 네임 스페이스는 이됩니다. 이 모든 일을 일단

이제, 당신은 문제가있는 다른 라인은 다음과 같습니다

string test = xml.ToString(); 

당신이 실제로 원하는 것은 아마도 반면, xml는이 루트 XML 노드를 의미 요소에 대한 질문 : xml.Element(XName.Get("VM_Name", "my")). 또한 해당 노드의 텍스트 내용을 가져 오려면 Value 속성을 사용해야합니다. 나는 당신이 정말로 원하는 것을 의심한다 :

string test = name.Value; 
+0

코드를 개인 무효로 바꿉니다. button1_Click (개체 보낸 사람, EventArgs 전자) { XElement xml = XElement.Load (" C : \\ Windows 7.xml "); IEnumerable propertyIDs = xml.Descendants ("PropertyId"); foreach (XElement propertyID in propertyIDs) { XElement name = xml.Element (XName.Get ("VM_Name", "my"))); string test = name.Value; Console.WriteLine (test); }} – dwyane

+0

String NullReferenceException 오류가 발생했습니다. test = name.Value; – dwyane

+0

@dwayne, 요소가 발견되지 않으면'Element' 메소드는'null'을 리턴합니다. 질문을 수정하고'C : \\ Windows 7.xml'의 내용을 포함하십시오. –