2011-11-22 62 views
3

好吧,這把我現在佔領了幾個小時,我仍然有它沒有解釋: 我的XML開始是這樣的:XmlNodeList保持爲空 - 爲什麼是這樣?

<?xml version="1.0" encoding="iso-8859-1"?> 
<ISO15745Profile xmlns="http://www.profibus.com/GSDML/2003/11/DeviceProfile" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.profibus.com/GSDML/2003/11/DeviceProfile ..\XSD\GSDML-DeviceProfile-v2.1.xsd"> 
<ProfileHeader> 
    <ProfileIdentification>PROFINET Device Profile</ProfileIdentification> 
    <ProfileRevision>1.00</ProfileRevision> 
    <ProfileName>Device Profile for PROFINET Devices</ProfileName> 
    <ProfileSource>PROFIBUS Nutzerorganisation e. V. (PNO)</ProfileSource> 
    <ProfileClassID>Device</ProfileClassID> 
    <ISO15745Reference> 
     <ISO15745Part>4</ISO15745Part> 
     <ISO15745Edition>1</ISO15745Edition> 
     <ProfileTechnology>GSDML</ProfileTechnology> 
    </ISO15745Reference> 
</ProfileHeader> 
<ProfileBody> 
    <DeviceIdentity DeviceID="0x000A" VendorID="0x00B0"> 
     <InfoText TextId="InfoTextId1"/> 
     <VendorName Value="Phoenix Contact GmbH"/> 
    </DeviceIdentity> 
    <DeviceFunction> 
     <Family MainFamily="I/O" ProductFamily="Inline"/> 
    </DeviceFunction> 
    <ApplicationProcess> 
     <DeviceAccessPointList> 
      <DeviceAccessPointItem ID="DIM 1" FixedInSlots="0" PhysicalSlots="0..64" MinDeviceInterval="32" ModuleIdentNumber="0x00000300" DNS_CompatibleName="IL-PN-BK-2TX" ImplementationType="ERTEC200" ObjectUUID_LocalIndex="1"> 
       <ModuleInfo> 
        <Name TextId="IL PN BK DI8 DO4 2TX"/> 
        <InfoText TextId="InfoTextId1"/> 
        <VendorName Value="Phoenix Contact"/> 
        <OrderNumber Value="2703994"/> 
       </ModuleInfo> 
       <SubslotList> 
        <SubslotItem SubslotNumber="32768" TextId="SubSlot_Interface"/> 
        <SubslotItem SubslotNumber="32769" TextId="SubSlot_Port1"/> 
        <SubslotItem SubslotNumber="32770" TextId="SubSlot_Port2"/> 
       </SubslotList> 
       <IOConfigData MaxInputLength="512" MaxOutputLength="512"/> 
       <UseableModules> 
        <ModuleItemRef FixedInSlots="1" ModuleItemTarget="1"/> 
        <ModuleItemRef AllowedInSlots="4..64" ModuleItemTarget="2"/> 
        <ModuleItemRef AllowedInSlots="4..64" ModuleItemTarget="3"/> 
        <ModuleItemRef AllowedInSlots="4..64" ModuleItemTarget="4"/> 
        <ModuleItemRef AllowedInSlots="4..64" ModuleItemTarget="5"/> 
        <ModuleItemRef AllowedInSlots="4..64" ModuleItemTarget="6"/> 
... 

現在我想要做的是與AllowedInSlots工作,但當創建一個XmlNodeList與

XmlDocument gsdml = new XmlDocument(); 
gsdml.Load(fpfad); 

XmlNodeList ModuleItemRef = gsdml.SelectNodes("/ISO15745Profile/ProfileBody/ApplicationProcess/DeviceAccessPointList/DeviceAccessPointItem/UseableModules"); 

XmlNodeList保持空。我究竟做錯了什麼?我認爲也許我必須和Namespacemanager一起工作並嘗試過,但那沒有做任何事情。

這是我做過這樣的嘗試:

XmlDocument gsdml = new XmlDocument(); 
gsdml.Load(fpfad); 

XmlNamespaceManager mgr = new XmlNamespaceManager(gsdml.NameTable); 
mgr.AddNamespace("iso", "http://www.profibus.com/GSDML/2003/11/DeviceProfile"); 
XmlNodeList ModuleItemRef = gsdml.SelectNodes("/iso:ISO15745Profile/ProfileBody/ApplicationProcess/DeviceAccessPointList/DeviceAccessPointItem/UseableModules", mgr); 

它沒有工作,雖然如此,事情必須有錯。

第二編輯: 包括路徑的每個部分的前綴做了竅門。

回答

3

確實是命名空間管理器。

xmlns="http://www.profibus.com/GSDML/2003/11/DeviceProfile" 

意味着一切都在該命名空間(除非其他默認聲明或元素聲明自己的命名空間)。您將需要使用名稱空間管理器在該名稱空間中進行搜索。

+0

好的,編輯了這個問題,以包含我嘗試處理該問題的(錯誤的?)代碼。 – Stefan

+0

再次編輯(終於搞定了)。感謝您幫助我,如果您沒有告訴我名稱空間實際上是問題,那麼可能會先嚐試其他方法。 – Stefan

+0

你在問題的第二個問題中寫了答案,但我會在這裏重寫它,以供將來看到的任何人使用。您必須在每個零件上指定名稱空間:「/ iso:ISO15745Profile/iso:ProfileBody/iso:ApplicationProcess ....」 –