2016-05-27 20 views
3

こんにちは私は誰かが私を助けてくれることを願っています。私はたくさんのことを研究しており、インターネット上で見つかることができるアイテムはどれも今まで役に立っていませんでした。C#で要素のXML属性を取得する方法

私は、サードパーティのアプリケーションによって生成されたエクスポートされたXMLファイルを読み込もうとしています。今、XMLが適切なXMLルールに従ってセットアップされているかどうか疑問に思っています。私はXMLの以下の部分があります。表示名の要素などを取得するには

<?xml version="1.0" encoding="utf-8"?> 
<Document> 
    <DocumentInfo> 
     <Created>2016-05-23T13:19:41.0528572Z</Created> 
     <ExportSetting>None</ExportSetting> 
     <InstalledProducts> 
      <Product> 
       <DisplayName>Some display name</DisplayName> 
       <DisplayVersion>Some display version</DisplayVersion> 
      </Product> 
      <OptionPackage> 
       <DisplayName>Some display name</DisplayName> 
       <DisplayVersion>Some display version</DisplayVersion> 
      </OptionPackage> 
      <Product> 
       <DisplayName>Some display name</DisplayName> 
       <DisplayVersion>Some display version</DisplayVersion> 
      </Product> 
      <OptionPackage> 
       <DisplayName>Some display name</DisplayName> 
       <DisplayVersion>Some display version</DisplayVersion> 
      </OptionPackage> 
      <Product> 
       <DisplayName>Some display name</DisplayName> 
       <DisplayVersion>Some display version</DisplayVersion> 
      </Product> 
     </InstalledProducts> 
    </DocumentInfo> 
    <Some.Block ID="0"> 
    <AttributeList> 
    <Interface> 
    <Sections xmlns="http://www.somenamespace.com"> 
     <Section Name="Input"> 
     <Member Name="Member name 1" Datatype="Bool" /> 
     <Member Name="Member name 2" Datatype="Int" /> 
     <Member Name="Member name 3" Datatype="Int" /> 
     </Section> 

することは、これは通常のXMLコードをそうなので問題ありませんが、2番目の部分は、かなり困難です。

属性名 'Input'を持つセクションのメンバー属性 'Name'と 'Datatype'のみの値を抽出します。

xmlnode = doc.GetElementsByTagName("Sections"); 
for (i = 0; i <= xmlnode.Count - 1; i++) 
{ 
    xmlnode[i].ChildNodes.Item(0).InnerText.Trim(); 
    str = xmlnode[i].ChildNodes.Item(0).InnerText.Trim() + " " + xmlnode[i].ChildNodes.Item(1).InnerText.Trim() + " " + xmlnode[i].ChildNodes.Item(2).InnerText.Trim(); 
    MessageBox.Show(str); 
} 

と、この試みた:これまでのところ何も働いていないと、コード

//XmlNodeList elemList = doc.GetElementsByTagName("Section[@Name='Input']"); 
//for (int x = 0; x < elemList.Count; x++) 
//{ 
// string attrVal = elemList[x].Attributes["Interface"].Value; 
//} 

私はXMLPath、getNodebytagnameでたくさんのことを試してみましたなどなど

はこれを試してみました名前空間の部分を超えているようには見えません。誰にもアイデアはありますか?

+0

たXMLNode [i]が.ChildNodes.Item(0).Attribute( "ATTRIBUTE_NAME")に辞書を持っていますバリュー – JaggenSWE

答えて

2

これが行います。

XmlNodeList nodes = doc.GetElementsByTagName("Section"); 

Dictionary<string, string> list = new Dictionary<string, string>(); 
foreach (XmlNode node in nodes) 
{ 
    if (node.Attributes != null && node.Attributes["Name"] != null && node.Attributes["Name"].Value == "Input") 
    { 
     foreach (XmlNode childNode in node.ChildNodes) 
     { 
      if (childNode.Attributes != null) 
       list.Add(childNode.Attributes["Name"].Value, childNode.Attributes["Datatype"].Value); 
     } 
    } 
} 

をあなたはフォーマット<Name, Datatype>

+0

で。あなたの最初の 'if'条件で' node.Attributes ["Name"]!= null'が 'node.Attributes'が決してヌルでないのでテストする必要があります... – Thomas

+0

@Thomasaそれを指摘してくれてありがとう。今修正されました。 – Nasreddine

関連する問題