[英]Extracting XML tags values
我有一個XML文件列表,我需要從每個文件中提取3個值。 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);
}
我沒有打印任何值,但是當我調試並檢查“列表”的內部值時,可以從該標記中看到所需的內容。
如何提取所需的信息?
您的代碼和所有其他答案將忽略默認名稱空間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();
嘗試以下方法:
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(因為其中只有一個)。 這就是為什么我包括list[0],ChildNodes
,以獲取name
元素的所有子元素( given
, given
和family
)的原因。
要檢索每個元素(“ John”,“ S”,“ Doe”)中的文本,應使用InnerText
而不是Value
從您的示例XML中尚不清楚是否只有一個<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);
}
如果您的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中的默認名稱空間,也需要顯式添加名稱空間? 看到: 這個答案
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.