2012-03-08 135 views
2

我有我需要以提取参数解析以下XML示例:不能提取元素(按元素名称和属性)

<?xml version="1.0" encoding="UTF-8"?> 
<bulkCmConfigDataFile xmlns:un="utranNrm.xsd" xmlns:xn="genericNrm.xsd" xmlns:gn="geranNrm.xsd" xmlns="configData.xsd" 
xmlns:es="Vendor1SpecificAttributes.1.0.xsd"> 
    <fileHeader fileFormatVersion="1.0" vendorName="Vendor1"/> 
    <configData dnPrefix="Undefined"> 
     <xn:SubNetwork id="ONRM_ROOT_MO_R"> 
      <xn:SubNetwork id="RNC0001"> 
       <xn:MeContext id="BLABLA"> 
       </xn:MeContext> 
       <xn:MeContext id="MACHIN"> 
       </xn:MeContext> 
       <xn:MeContext id="RNC0001"> 
        <xn:VsDataContainer id="RNC0001"> 
        </xn:VsDataContainer> 
        <xn:ManagedElement id="1"> 
         <un:RncFunction id="1"> 
          <un:UtranCell id="111111A"> 
           <un:attributes> 
            <un:uarfcnUl>9800</un:uarfcnUl> 
            <un:uarfcnDl>10700</un:uarfcnDl> 
           </un:attributes> 
           <xn:VsDataContainer id="111111A"> 
            <es:Position> 
            <es:latitudeSign>1</es:latitudeSign> 
            <es:latitude>3070727</es:latitude> 
            <es:longitude>8786820</es:longitude> 
            </es:Position> 
           </xn:VsDataContainer> 
           <xn:VsDataContainer id="1"> 
           </xn:VsDataContainer> 
          </un:UtranCell> 
          <un:UtranCell id="111111B"> 
           <un:attributes> 
            <un:uarfcnUl>9800</un:uarfcnUl> 
            <un:uarfcnDl>10700</un:uarfcnDl> 
           </un:attributes> 
           <xn:VsDataContainer id="111111B"> 
            <es:Position> 
            <es:latitudeSign>1</es:latitudeSign> 
            <es:latitude>3070555</es:latitude> 
            <es:longitude>8786666</es:longitude> 
            </es:Position> 
           </xn:VsDataContainer> 
           <xn:VsDataContainer id="1"> 
           </xn:VsDataContainer> 
          </un:UtranCell> 
         </un:RncFunction> 
        </xn:ManagedElement> 
       </xn:MeContext> 
      </xn:SubNetwork> 
     </xn:SubNetwork> 
    </configData> 
    <fileFooter dateTime="2011-11-28T08:38:45Z"/> 
</bulkCmConfigDataFile>    

到目前为止,我只能够检索按名称给定命名空间第一个元素:

XNamespace xn = "genericNrm.xsd"; 
XNamespace un = "utranNrm.xsd"; 
var test1 = xmldoc.Descendants(xn + "MeContext").FirstOrDefault(); 

这将只给我的第一个元素“MeContext”(在这个例子中,这将使用id = BLABLA返回MeContext)。

如果我尝试以下方法,而不是

XNamespace xn = "genericNrm.xsd"; 
XNamespace un = "utranNrm.xsd"; 
var test1 = xmldoc.Descendants(xn + "MeContext"); 

test1的将是空的......

1 - 我的第一个问题是,我该如何检索使用其“id”属性的特定元素(在本具体的例子我正在寻找id =“RNC0001”)。我尝试了很多东西来自包括以下的计算器:

XNamespace xn = "genericNrm.xsd"; 
IEnumerable<XElement> utrancells = 
          xmldoc.Root 
            .Elements(xn + "MeContext") 
            .Where(el => (string)el.Attribute("id") == "RNC0001"); 

它只返回空值。

2 - 第二个问题是如何检索<xn:MeContext id="RNC0001"></xn:MeContext>中的元素集合? 我想获得集合中的所有<un:UtranCell id="XXXXX"></un:UtranCell>(和内容),以便我可以从每个集合中提取数据(每个代表不同的实体)。比如我需要检索

<es:latitude>3070555</es:latitude> 
<es:longitude>8786666</es:longitude> 
从各 <un:UtranCell id="XXXXX"></un:UtranCell>

为此,我试过

(作为测试):

XNamespace un = "utranNrm.xsd"; 
var test3 = xmldoc.Elements(un + "UtranCell"); 
var test4 = test1.Elements(un + "UtranCell"); 

,并再次它只返回空值...

丹尼尔编辑:真实代码是:

public void parseFile() 
{ 
    XNamespace xn = "genericNrm.xsd"; 
    XNamespace un = "utranNrm.xsd"; 
    XNamespace cd = "configData.xsd"; 

    var test1 = xmldoc.Descendants(xn + "MeContext").FirstOrDefault(); 
    var test1bis = xmldoc.Descendants(xn + "MeContext"); 
} 

这给了我: TEST1 = <xn:MeContext id="BLABLA" xmlns:xn="genericNrm.xsd"></xn:MeContext>

test1bis = {System.Xml.Linq.XContainer.GetDescendants} | name = null

回答

1

两种情况下的问题是您使用的是Elements而不是Descendants。区别在于Elements仅返回那些直接子元素 - 即一个深度的元素,而Descendants搜索整个子树。试试这个:

IEnumerable<XElement> utrancells = 
    xmldoc.Root 
      .Descendants(xn + "MeContext") 
      .Where(el => (string)el.Attribute("id") == "RNC0001"); 
+0

我不好意思,我忘了提这个。我也尝试了你的建议,并且它在'utranCells'中返回一个空值。 在我的第一个问题,如果我尝试 'VAR TEST1 = xmldoc.Descendants(XN + “MeContext”);'的替代 'VAR TEST1 = xmldoc.Descendants(XN + “MeContext”)FirstOrDefault()。 ' 我也得到一个空值。我会更新我的问题,以反映这 – Yeti 2012-03-08 07:21:27

+1

@Yeti:那不可能。我只是测试它,'xmldoc.Descendants(xn +“MeContext”)'返回3个项目。请显示给你'null'的真实代码。 – 2012-03-08 07:36:13

+0

@DanielHilgarth我在问题的最后添加了真正的代码。 – Yeti 2012-03-08 08:00:03