Борьба с XML

#c# #xml

#c# #xml

Вопрос:

Я изо всех сил пытаюсь получить свою информацию для клиентов XML. Я долгое время работал с in. Мне нужно извлечь всю информацию из XML, но я думаю, что я неправильно понимаю xpath. Кто-нибудь может мне помочь? XML слишком большой, чтобы показать все, но это часть с нужной мне информацией. Почти в конце есть узел с «VarName» и значением, начинающимся с g_stCal. XML содержит около 1000 таких информационных блоков, и мне нужно получить VarName и VarType для всех.

Этот код на C # не дает мне правильного списка:

 XmlNodeList nodeList = root.SelectNodes("/TcPlcObject/RecipeManager[@Name = 
'RecipeManager']//RecipeDefinition[@Name = 
'calibrations']//XmlArchive//Data//o//o[@n='RecipeVariables']//l[@n='Variables']");

foreach (XmlElement item in nodeList)
            {
              // get VarName and value an store in a normal List
            }
  
 <?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1" ProductVersion="3.1.4024.3">
  <RecipeManager Name="RecipeManager" Id="{a936232e-5e4d-44e8-8fb7-8b891ce7f6ff}">
    <XmlArchive>
      <Data>
        <o xml:space="preserve" t="RecipeManObject">
          <o n="LMGuids" t="LanguageModelGuidHelper">
            <d n="NamesAndGuids" t="Hashtable" ckt="String" cvt="Guid">
              <v>GVL_RECIPEMANAGEMENT_3300</v>
              <v>67dcf6a8-d960-4806-b5b6-3319f101b6bd</v>
              <v>RECIPEFACTORY</v>
              <v>518b7a67-680a-4dc0-bdf0-4e7a77875b16</v>
              <v>RECIPEMANAGEMENTINIT</v>
              <v>52327efb-4e60-4f4e-8679-faa7fa57da60</v>
              <v>RECIPEFACTORYFREERECIPE</v>
              <v>fc6c29b3-b336-41c1-adcd-a4e63da7e55b</v>
              <v>RECIPEFACTORYFB_INIT</v>
              <v>3a3f16ac-ddaf-4919-8801-f96e12f4fd1b</v>
              <v>RECIPEFACTORYCREATERECIPE</v>
              <v>83d37157-0fc8-4b69-a842-e59d257cd5c6</v>
              <v>RECIPEMANAGEMENTINITFB_INIT</v>
              <v>9ada2241-ee20-427f-8b4f-cd1e57bf58c9</v>
              <v>RECIPEMANAGEMENTINITINITIALIZE</v>
              <v>832d6323-fbfd-4abf-8298-c936fed233e7</v>
              <v>RECIPEMANAGEMENTINITFB_REINIT</v>
              <v>cea2d526-06d1-4a84-9b81-f685f77b11c8</v>
            </d>
          </o>
          <o n="StorageSettings" t="RecipeManagerStorageSettings">
            <v n="StorageType">1U</v>
            <v n="LoadType">1U</v>
            <v n="WriteType">0U</v>
            <v n="FileExtension">".rcp"</v>
            <v n="FilePath">"C:Recipes"</v>
            <v n="TokenSeparator">":="</v>
            <v n="ColumnList">"0|1"</v>
            <v n="AutoSaveRecipes">true</v>
          </o>
          <v n="RecipesInPlc">true</v>
          <v n="RecipesInPlcAssigned">true</v>
        </o>
      </Data>
      <TypeList>
        <Type n="Boolean">System.Boolean</Type>
        <Type n="Guid">System.Guid</Type>
        <Type n="Hashtable">System.Collections.Hashtable</Type>
        <Type n="LanguageModelGuidHelper">{3bce4913-f2c1-4b54-84e8-6d7ec1809176}</Type>
        <Type n="RecipeManagerStorageSettings">{9af4bea6-fc90-45e0-8fd7-eb50506b56da}</Type>
        <Type n="RecipeManObject">{09ecc42e-586d-4a08-932f-5bdcac20bb55}</Type>
        <Type n="String">System.String</Type>
        <Type n="UInt32">System.UInt32</Type>
      </TypeList>
    </XmlArchive>
    <RecipeDefinition Name="calibrations" Id="{d7a7d7f9-aaad-4672-a861-5944d3830bc9}">
      <XmlArchive>
        <Data>
          <o xml:space="preserve" t="RecipeDefinitionObject">
            <v n="UniqueIdGenerator">"361"</v>
            <o n="Recipes" t="RecipeList">
              <l n="Recipes" t="ArrayList" />
            </o>
            <o n="RecipeVariables" t="RecipeVariableList">
              <l n="Variables" t="ArrayList" cet="RecipeVariable">
                <o>
                  <v n="VarName">"g_stCAL.bDummy"</v>
                  <v n="VarType" t="TypeClass">Bool</v>
                  <v n="VarTypeAsString">"BOOL"</v>
                  <v n="Name">""</v>
                  <n n="Boundaries" />
                  <v n="Id">73</v>
                  <v n="Comment">""</v>
                  <v n="VarUserDefTypeAsString">"BOOL"</v>
                </o>
                <o>
  

Кто-нибудь знает, что я делаю не так?
Я также получаю много узлов в списке с «Значительным белым пространством»

Ответ №1:

Данные в каждом sectio0n не согласованы. Я отформатировал приведенный ниже xml, чтобы вы могли легко увидеть различия

 <?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1" ProductVersion="3.1.4024.3">
  <RecipeManager Name="RecipeManager" Id="{a936232e-5e4d-44e8-8fb7-8b891ce7f6ff}">
    <XmlArchive>
      <Data>
        <o xml:space="preserve" t="RecipeManObject">
          <o n="LMGuids" t="LanguageModelGuidHelper">
            <d n="NamesAndGuids" t="Hashtable" ckt="String" cvt="Guid">
              <v>GVL_RECIPEMANAGEMENT_3300</v>
              <v>67dcf6a8-d960-4806-b5b6-3319f101b6bd</v>
              <v>RECIPEFACTORY</v>
              <v>518b7a67-680a-4dc0-bdf0-4e7a77875b16</v>
              <v>RECIPEMANAGEMENTINIT</v>
              <v>52327efb-4e60-4f4e-8679-faa7fa57da60</v>
              <v>RECIPEFACTORYFREERECIPE</v>
              <v>fc6c29b3-b336-41c1-adcd-a4e63da7e55b</v>
              <v>RECIPEFACTORYFB_INIT</v>
              <v>3a3f16ac-ddaf-4919-8801-f96e12f4fd1b</v>
              <v>RECIPEFACTORYCREATERECIPE</v>
              <v>83d37157-0fc8-4b69-a842-e59d257cd5c6</v>
              <v>RECIPEMANAGEMENTINITFB_INIT</v>
              <v>9ada2241-ee20-427f-8b4f-cd1e57bf58c9</v>
              <v>RECIPEMANAGEMENTINITINITIALIZE</v>
              <v>832d6323-fbfd-4abf-8298-c936fed233e7</v>
              <v>RECIPEMANAGEMENTINITFB_REINIT</v>
              <v>cea2d526-06d1-4a84-9b81-f685f77b11c8</v>
            </d>
          </o>
          <o n="StorageSettings" t="RecipeManagerStorageSettings">
            <v n="StorageType">1U</v>
            <v n="LoadType">1U</v>
            <v n="WriteType">0U</v>
            <v n="FileExtension">".rcp"</v>
            <v n="FilePath">"C:Recipes"</v>
            <v n="TokenSeparator">":="</v>
            <v n="ColumnList">"0|1"</v>
            <v n="AutoSaveRecipes">true</v>
          </o>
          <v n="RecipesInPlc">true</v>
          <v n="RecipesInPlcAssigned">true</v>
        </o>
      </Data>
      <TypeList>
        <Type n="Boolean">System.Boolean</Type>
        <Type n="Guid">System.Guid</Type>
        <Type n="Hashtable">System.Collections.Hashtable</Type>
        <Type n="LanguageModelGuidHelper">{3bce4913-f2c1-4b54-84e8-6d7ec1809176}</Type>
        <Type n="RecipeManagerStorageSettings">{9af4bea6-fc90-45e0-8fd7-eb50506b56da}</Type>
        <Type n="RecipeManObject">{09ecc42e-586d-4a08-932f-5bdcac20bb55}</Type>
        <Type n="String">System.String</Type>
        <Type n="UInt32">System.UInt32</Type>
      </TypeList>
    </XmlArchive>
    <RecipeDefinition Name="calibrations" Id="{d7a7d7f9-aaad-4672-a861-5944d3830bc9}">
      <XmlArchive>
        <Data>
          <o xml:space="preserve" t="RecipeDefinitionObject">
            <v n="UniqueIdGenerator">"361"</v>
            <o n="Recipes" t="RecipeList">
              <l n="Recipes" t="ArrayList" />
            </o>
            <o n="RecipeVariables" t="RecipeVariableList">
              <l n="Variables" t="ArrayList" cet="RecipeVariable">
                <o>
                  <v n="VarName">"g_stCAL.bDummy"</v>
                  <v n="VarType" t="TypeClass">Bool</v>
                  <v n="VarTypeAsString">"BOOL"</v>
                  <v n="Name">""</v>
                  <n n="Boundaries" />
                  <v n="Id">73</v>
                  <v n="Comment">""</v>
                  <v n="VarUserDefTypeAsString">"BOOL"</v>
                </o>
              </l>
            </o>
          </o>
        </Data>
      </XmlArchive>
    </RecipeDefinition>
  </RecipeManager>
</TcPlcObject>