首页 > 解决方案 > 与 XML 斗争

问题描述

我正在努力获取客户 XML 的信息。我工作了很长时间。我需要从 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>

任何人都知道我做错了什么?我还在“SignificantWhitespace”列表中获得了很多节点

标签: c#xml

解决方案


每个section0n中的数据并不一致。我对下面的 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>

推荐阅读