2010-08-04 3 views
2

Je crée un fichier XML en C# en utilisant un schéma XSD d'un formulaire InfoPath.C#: Modification de l'en-tête d'un fichier XML

Quand je sauve la forme IP sans utiliser le code, je reçois un fichier XML avec l'en-tête suivant:

<?xml version="1.0" encoding="UTF-8"?> 
<?mso-infoPathSolution solutionVersion="1.0.0.113" productVersion="14.0.0" PIVersion="1.0.0.0" href="file:///\\Hmfp\mcs-shared\PMU\PMU-shared\Tests\QF%207.5%20PMU%20Project%20Outline%20Form%20F1.0.xsn" name="urn:schemas-microsoft-com:office:infopath:QF-7-5-PMU-Project-Outline-Form-F1-0:-myXSD-2010-07-22T07-48-32" ?> 
<?mso-application progid="InfoPath.Document"?> 
<my:myFields... 

Ce fichier est reconnu par InfoPath et utilise la XSD correcte, affichant ainsi les données XML sous la forme correcte.

Mais quand j'utilise le code, je reçois ceci:

<?xml version="1.0"?> 
<myFields... 

Et ce n'est pas reconnu, ni ouvert directement par InfoPath; donc je voudrais insérer les deux balises afin de garder cette fonctionnalité, de sorte que les utilisateurs ne voient pas la différence.

Ma ligne de pensée est de modifier le fichier XML après qu'il a déjà été créé, enregistré et fermé.

Ce serait très bien si vous pouviez aider: D. Merci d'avance ..

EDIT: J'ai finalement réussi à réaliser ce que je voulais. Je profitai des deux et de dahlbyk de MainMa réponses et est venu avec quelque chose qui fonctionne:

  • Je laisse le fichier sont sauvés comme avant
  • J'ai créé un objet XmlReader à partir du fichier
  • I chargé le XmlReader dans un objet XmlDocument
  • I créé un objet en utilisant XmlProcessingInstructionXmlDocument.CreateProcessingInstruction
  • J'inséré que PI dans le XmlDoc en utilisant xmlDoc.InsertAfter(thePI, XmlDoc.FirstChild)
  • J'ai ensuite créé un second PI objet
  • Ce que j'inséré à l'aide xmlDoc.InsertAfter(thePI, XmlDoc.FirstChild.NextSibling)
  • Je sauvé la XmlDoc dans le fichier, l'écraser

Quoi qu'il en soit, tes réponses m'ont aidé à comprendre beaucoup de choses, ce qui m'a fait trouver la réponse, alors merci beaucoup !!

+0

Le code XML est-il généré par une API InfoPath ou utilisez-vous l'une des API .NET XML? – dahlbyk

+0

Je suppose que ce serait une API .NET XML, utilisant un service Web ASP.NET, avec du code C#. J'utilise System.Xml.Serialization.XmlSerializer avec le schéma XSD, puis j'écris dans un objet FileStream. – Yusuf

Répondre

0

Les trois premières lignes de votre premier échantillon de code sont appelées Instructions de traitement XML (PI). Donc, si vous créez votre sortie XML avec XmlDocument, vous pouvez utiliser la méthode XmlDocument.CreateProcessingInstruction pour ajouter le PI requis.

Si vous numérotez en XML, vous pouvez également utiliser XmlTextWriter.WriteProcessingInstruction juste avant la sérialisation de l'objet.

Si pour certaines raisons, vous ne pouvez pas faire cela, vous pouvez également enregistrer le fichier, ouvrez-le et insérez deux PI après la première coupure de ligne, mais je décourage fortement vous de le faire, car il fera votre code difficile à maintenir à l'avenir, et ralentir les choses.

+0

Merci beaucoup pour la réponse rapide. La deuxième option me semble très intéressante; la classe créée pour le schéma XSD s'appelle myFields; J'ai donc un WebMethod appelé SubmitForm qui utilise une instance "newForm" de cette classe. Comment créer l'instance XmlTextWriter avec ceci? Désolé si cela semble stupide, mais c'est la première fois (et peut-être même la dernière) que j'utilise .NET et XML. J'ai juste quelques notions vagues et je le fais en cherchant tout sur Google: D. – Yusuf

+0

OK, j'ai été capable de créer l'instance XmlTextWriter, et j'ai même écrit le PI; Cependant, il ajoute le PI à la fin du fichier, alors qu'il aurait dû être au sommet. Je dois dire que j'ai d'abord créé une instance TextWriter à partir du fichier que j'ai déjà créé, puis une instance XmlTextWriter de celle-ci. – Yusuf

+0

S'il ajoute le PI, cela signifie probablement que vous appelez 'WriteProcessingInstruction' après la sérialisation de l'objet. Si oui, appelez le * avant * la sérialisation. –

1

J'essayer de faire un XmlWriter pour votre FileStream, utilisez WriteProcessingInstruction() ajouter vos têtes, puis passer l'écrivain dans la surcharge appropriée de Serialize() pour capturer le reste de la sortie.

+0

Enfin je suis venu à utiliser cette solution en fait, mais j'ai encore le problème de la mise en place du PI avant le ' Yusuf