2013-09-16 72 views
1

我有以下XML:如何从名称空间的XML元素检索记录?

<Document xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:hl7-org:v3 CDA_SDTC.xsd" xmlns="urn:hl7-org:v3" xmlns:cda="urn:hl7-org:v3" xmlns:sdtc="urn:hl7-org:sdtc"> 
<component> 
<structuredBody> 
    <component> 
    <section> 
     <templateId root="abs" /> 
     <title>A1</title> 
     <text> 
     <paragraph>Hello world!</paragraph> 
     </text> 
    </section> 
    </component> 
</structuredBody> 
</component> 
</Document> 

我用下面的代码来获取paragraph

XDocument m_xmld = XDocument.Load(Server.MapPath("~/xml/a.xml")); 
var m_nodelist = m_xmld.Descendants().Where(p => p.Name.LocalName == "section"). 
    Select(i => i.Element("text").Element("paragraph").Value).ToList(); 

错误:

Object reference not set to an instance of an object. 

但是下面的代码工作正常,但我想要使用上面的代码。

XNamespace ns = "urn:hl7-org:v3"; 
var m_nodelist = m_xmld.Descendants(ns + "section"). 
     Select(i => i.Element(ns + "text").Element(ns + "paragraph").Value).ToList(); 

回答

1
var m_nodelist = m_xmld.Descendants().Where(p => p.Name.LocalName == "rows"). 
Select(u => u.Attribute("fname").Value).ToList(); 

更新:

var m_nodelist = m_xmld.Descendants().Where(p => p.Name.LocalName == "section"). 
Select(u => (string)u.Descendants().FirstOrDefault(p => p.Name.LocalName == "paragraph")).ToList(); 
+0

我的XML文件太大,如何将其转换成字符串“串x” –

+0

又是怎样从我答的是差异.. – Anirudha

+0

我问题编辑 –

1

xmlns="urn:hl7-org:v3"是默认的命名空间,所以需要引用...

XNamespace ns="urn:hl7-org:v3"; 
m_xmld.Descendants(ns+"rows").... 

OR

可以避免命名空间本身

m_xmld.Elements().Where(e => e.Name.LocalName == "rows") 
+0

我的问题编辑 –

1

试试这个

var m_nodelist = m_xmld.Root.Descendants("rows") 

如果你想选择的节点时指定的命名空间,你可以尝试

var m_nodelist = m_xmld.Root.Descendants(XName.Get("rows", "urn:hl7-org:v3")) 
+0

第一种方法不行 –

+0

我的问题编辑 –

0

正如你正确识别,你需要附加namespace到th e节点查找。

XNamespace nsSys = "urn:hl7-org:v3"; 
var m_nodelist = m_xmld.Descendants(nsSys + "rows").Select(x => x.Attribute("fname").Value).ToList(); 
相关问题