2016-09-20 11 views
2

各ファイルから3つの値を抽出するために必要なXMLファイルのリストがあります。 XMLは多少のようになります。XMLタグの値を抽出する

<ClinicalDocument xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" moodCode="EVN" xmlns="urn:hl7-org:v3"> 
    <title>Summary</title> 

    <recordTarget> 
    <patientRole> 
     <patient> 
     <name> 
      <given>John</given> 
      <given>S</given> 
      <family>Doe</family> 
     </name> 
     <birthTime value="19480503" /> 

私は与えられた名前、家族の名前と誕生時間を抽出しようとしています。

当初、私は使用して値をプリントアウトしようとしている:

XmlDocument doc2 = new XmlDocument(); 
doc2.Load(@"Z:\\DATA\\file.XML"); 

XmlElement root = doc2.DocumentElement; 
XmlNodeList list = root.GetElementsByTagName("name"); 
for (int i = 0; i < list.Count; i++) 
{ 
    Console.WriteLine(list.Item(i).Value); 
} 

私が印刷された任意の値を取得していないんだけど、私はデバッグし、「リスト」の内側の値をチェックするとき、私は何をI見ることができますそのタグからの必要性。

必要な情報をどのように抽出できますか?

答えて

4

あなたのコードと他のすべての答えがxmlns="urn:hl7-org:v3"

は、私が使用しやすいLinq2Xml見つけるデフォルトの名前空間を無視するので、私はそれを使用して答えを投稿します。..

var xDoc = XDocument.Load(filename); 

var @namespace = "urn:hl7-org:v3"; 

XmlNamespaceManager namespaceManager = new XmlNamespaceManager(xDoc.CreateNavigator().NameTable); 
namespaceManager.AddNamespace("ns", @namespace); 
XNamespace ns = @namespace; 

var names = xDoc.XPathSelectElements("//ns:patient/ns:name", namespaceManager).ToList(); 

var list = names.Select(p => new 
       { 
        Given = string.Join(", ", p.Elements(ns + "given").Select(x => (string)x)), 
        Family = (string)p.Element(ns + "family"), 
        BirthTime = new DateTime(1970,1,1).AddSeconds((int)p.Parent.Element(ns + "birthTime").Attribute("value")) 
       }) 
      .ToList(); 
+0

その名前空間は何をしますか?また、生年月日タグはどのように含めることができますか? – WT86

+2

@ WT86最初に答えをテストし、xmlについていくつかのドキュメントを読んでください。答えが見つからない場合は、*誕生日を含める方法をお手伝いします。 – EZI

+1

@EZI Will :) do – WT86

2

代わりにこれを試してみてください:

XmlDocument doc2 = new XmlDocument(); 
doc2.Load(@"Path\To\XmlFile.xml"); 

XmlElement root = doc2.DocumentElement; 
XmlNodeList list = root.GetElementsByTagName("name"); 

var names = list[0].ChildNodes; 

for (int i = 0; i < names.Count; i++) 
{ 
    Console.WriteLine(names[i].InnerText); 
} 

出力:

John 
S 
Doe 

あなたのコードと2つの問題があります。

  • あなたはname要素の周りに反復された最初のビーイングこれにはCountが1つしかありません(これらのうちの1つのみがあるため)。それでname要素(givengivenfamily)のすべての子を取得するには、list[0],ChildNodesを含めました。各要素内のテキストを取得するために

  • 、(「ジョン」、「S」、「ドウ」)は、あなたがInnerText代わりのValue

+1

をあなたが私を打ち負かしますそれは:)良い答え – Roman

-1

を使用する必要があることがあればそこにあなたの例のXMLから明らかではありませんただ1つの<name>要素であるか、複数ある可能性がある場合です。以下は、複数の可能性があると仮定しています。それはまた、誕生日をつかむ。

for (int i = 0; i < list.Count; i++) 
{ 
    var xmlNode = list.Item(i).FirstChild; 

    while (xmlNode != null) 
    { 
     Console.WriteLine(xmlNode.InnerText); 
     xmlNode = xmlNode.NextSibling; 
    } 
} 

XmlNodeList birthDates = root.GetElementsByTagName("birthTime"); 

for (int i = 0; i < list.Count; i++) 
{ 
    Console.WriteLine(birthDates[i].Attributes["value"].Value); 
} 
-1

あなたができるあなたのXML内の複数の<patient>要素がある場合:

using System; 
using System.Xml; 
using System.Xml.Linq; 
using System.Xml.XPath; 

class Program 
{ 
    static void Main() 
    { 
     var doc = XDocument.Load("a.xml"); 
     var nsm = new XmlNamespaceManager(new NameTable()); 
     nsm.AddNamespace("x", "urn:hl7-org:v3"); 
     var patients = doc.XPathSelectElements("//x:patient", nsm); 
     foreach (var patient in patients) 
     { 
      Console.WriteLine(patient.XPathSelectElement("./x:name/x:given[1]", nsm).Value); 
      Console.WriteLine(patient.XPathSelectElement("./x:name/x:given[2]", nsm).Value); 
      Console.WriteLine(patient.XPathSelectElement("./x:name/x:family", nsm).Value); 
      Console.WriteLine(patient.XPathSelectElement("./x:birthTime", nsm).Attribute("value").Value); 
     } 
    } 
} 

は、あなたはそれがXMLのデフォルトの名前空間だ場合でも、明示的に名前空間を追加する必要がありますなぜ?参照:this answer

関連する問題