2010-06-30 6 views
0
<Root> 
    <Application> 
    <AppName>App1</AppName> 
    <IdMark>ClassName</IdMark> 
    <ClassName>Notepad</ClassName> 
    <ExecName>Notepad</ExecName> 
    <Mod> 
    <ModName>HookPrintAPIs</ModName> 
    <Api> 
     <ApiName>TextOutA</ApiName> 
     <ApiName>TextOutW</ApiName> 
     <ApiName>ExtTextOutA</ApiName> 
     <ApiName>ExtTextOutW</ApiName> 
     <ApiName>DrawTextA</ApiName> 
     <ApiName>DrawTextW</ApiName> 
     <ApiName>DrawTextExA</ApiName> 
     <ApiName>DrawTextExW</ApiName> 
     <ApiName>GdiDrawString</ApiName> 
    </Api> 
    </Mod> 
    </Application> 
</Root> 

j'ai un fichier xml je veux analyser ce x, fichier l et que vous souhaitez stocker dans un objet comment il est possibleproblème d'analyse syntaxique xml en C#

j'ai utilisé la technique d'analyse syntaxique comme ce

ArrayList oArrayListForModuleName = new ArrayList(); 
ArrayList oArrayListClass = new ArrayList(); 
ArrayList oArrayListApi = new ArrayList(); 
List<string> oListofApiName1 = new List<string>(); 
while (oRreader.Read()) 
{ 
    if (oRreader.NodeType == XmlNodeType.Element) 
    { 
    switch (oRreader.Name) 
     { 
     case "AppName": 
         oRreader.Read(); 
         oArrayListClass.Add(oRreader.Value); 
         break; 
     case "IdMark": 
         oRreader.Read(); 
         oArrayListClass.Add(oRreader.Value); 
         break; 
     case "ClassName": 
         oRreader.Read(); 
         oArrayListClass.Add(oRreader.Value); 
         break; 
     case "ExecName": 
         oRreader.Read(); 
         oArrayListClass.Add(oRreader.Value); 
         break; 
     case "ModName": 
         oRreader.Read(); 
         oArrayListForModuleName.Add(oRreader.Value); 
         break; 
     case "ApiName": 
         oRreader.Read(); 
         oArrayListApi.Add(oRreader.Value); 
         oListofApiName1.Add(oRreader.Value); 
         break; 
        } 
       } 
      } 
oRreader.Close(); 
for (int i = 0; i < oArrayListApi.Count; i++) 
{ 
if (oArrayListApi[i].Equals("Not Set")) 
    { 
     oArrayListApi[i] = ""; 
    } 
} 

for (int i = 0; i < oArrayListForModuleName.Count; i++) 
{ 
    if (oArrayListForModuleName[i].Equals("Not Set")) 
    { 
    oArrayListForModuleName[i] = ""; 
    } 
} 
int counter = 0; 
int countformod = 0; 
while (j < oArrayListClass.Count) 
    { 
    CConfigManager oXmlHook = new CConfigManager(); 
    oXmlHook.uAppName = oArrayListClass[j].ToString(); 
    oXmlHook.uIdMark = oArrayListClass[++j].ToString(); 
    oXmlHook.uClassName = oArrayListClass[++j].ToString(); 
    oXmlHook.uExecName = oArrayListClass[++j].ToString(); 
    for (int cntr = 0; cntr < countofapi; cntr++) 
     { 
     oXmlHook.oListOfApiName.Add(oArrayListApi[counter].ToString()); 
     counter++; 
     } 
    for (int c = 0; c < countofmodule; c++) 
     { 
     oXmlHook.oListOfModuleName.Add(oArrayListForModuleName[countformod].ToString()); 
     countformod++; 
     } 
    oArrListOfObject.Add(oXmlHook); 
    j++; 
} 
+0

J'utiliserais XmlDocument ou XElement au lieu d'analyser manuellement - si vous ne pouvez pas les utiliser, vous pouvez expliquer pourquoi. –

Répondre

1

utilisation ou Google « sérialisation XML » dans le .NET Framework see the link

2

la façon la plus efficace de le faire est d'utiliser l'outil xsd.exe qui fait partie du SDK de Windows. Vous devriez avoir un xsd.exe dans vos invites Visual Studio quelque part - sinon, il serait situé dans un répertoire C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bin\ (ou similaire, dépend de votre machine et la version du système d'exploitation).

En utilisant xsd.exe, vous pouvez transformer votre XML dans un fichier XSD (schéma XML):

xsd yourfile.xml 

Cela vous donnera un fichier de schéma yourfile.xsd. Utilisez xsd.exe une deuxième fois, vous pouvez le transformer en une classe C#:

xsd yourfile.xsd /c 

et maintenant vous devriez avoir une yourfile.cs qui contient une définition de classe qui est capable de désérialiser ce fichier en objets.

Pour ce faire, utilisez quelque chose comme ceci:

XmlSerializer ser = new XmlSerializer(typeof(Root)); 
XmlReader xr = XmlReader.Create("YourFile.xml"); 

var result = ser.Deserialize(xr); 

et vous devriez avoir votre XML représenté comme un objet C# maintenant.

+0

J'ai toujours l'habitude de créer mes cours moi-même, je n'ai jamais su que cet outil existait! Merci de m'avoir rendu la vie un peu plus facile: D – Peter