2012-03-08 158 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