C# XDocument de Charge avec plusieurs racines
J'ai un fichier XML avec pas de racine. Je ne peux pas changer cela. Je suis en train de l'analyser, mais XDocument.Load
ne le fera pas. J'ai essayé de mettre ConformanceLevel.Fragment
, mais j'ai toujours une exception. Quelqu'un aurait-il une solution à cela?
J'ai essayé avec XmlReader
, mais les choses sont foiré et ne peut pas le faire fonctionner à droite. XDocument.Load
fonctionne très bien, mais si j'ai un fichier avec plusieurs racines, il ne le fait pas.
XDocument.Load
ne fonctionne pas, car ce type de fichier n'est pas un document XML valide.Pouvez-vous poster le code que vous avez essayé jusqu'à présent?
Autre question, même réponse: stackoverflow.com/a/9378442
Pourquoi ne pouvez-vous pas simplement utiliser XElement analyser
Parce qu'alors, vous obtenez cette exception: élément Racine est manquant.
OriginalL'auteur Darksody | 2013-08-12
Vous devez vous connecter pour publier un commentaire.
XmlReader
lui-même prend en charge la lecture de fragment xml - c'est à direCependant
XDocument.Load
ne prend pas en charge la lecture des fragments xml.Façon rapide et sale est d'envelopper les nœuds sous une racine virtuelle avant d'appeler la
XDocument.Parse
. Comme:Cette approche est limitée à de petits fichiers xml - comme vous avez pu le lire fichier dans la mémoire de la première; et la concaténation de la chaîne moyens de transporter de gros objets dans la mémoire - ce qui est préférable d'éviter.
Si la performance est importante, vous devriez lire les nœuds en
XDocument
un par un viaXmlReader
comme expliqué dans l'excellent @Martin-Honnen 's réponse (https://stackoverflow.com/a/18203952/2440262)Si vous utilisez l'API qui prend pour acquis que
XmlReader
itère sur xml valide, et des questions de rendement, vous pouvez utiliser rejoint flux approche plutôt:Multiflux - voir, par exemple, https://gist.github.com/svejdo1/b9165192d313ed0129a679c927379685
Remarque:
XDocument
charge l'ensemble de xml en mémoire. Donc ne l'utilisez pas pour les gros fichiers - au lieu d'utiliserXmlReader
pour l'itération et de ne charger que les morceaux croustillants commeXElement
viaXNode.ReadFrom(...)
XDocument.Parse()
devrait éliminer la nécessité pour l'emballage de la chaîne dans unStringReader
.OriginalL'auteur Ondrej Svejdar
Le seul dans la mémoire de l'arbre de représentations de dans le .NET framework qui peut traiter avec les fragments sont
XmlDocumentFragment
.NET du DOM de la mise en œuvre de sorte que vous devez créer unXmlDocument
et un fragment avec, par exemple,ou est
XPathDocument
où vous pouvez en créer un à l'aide d'un XmlReader avec ConformanceLevel ensemble de Fragment:Évidemment XPathNavigator est en lecture seule.
Si vous souhaitez utiliser LINQ to XML puis je suis d'accord avec les suggestions que vous avez besoin pour créer un XElement comme un wrapper. Au lieu de tirer dans une chaîne de caractères avec le contenu du fichier vous pouvez, toutefois, utiliser
XNode.ReadFrom
avec un XmlReader par exemplepuis
Qui pourrait fonctionner mieux et plus efficacement que la lecture tout en une chaîne de caractères.
OriginalL'auteur Martin Honnen
Si vous souhaitez utiliser XmlDocument.Load() puis vous devez envelopper le contenu dans un nœud racine.
ou vous pouvez essayer quelque chose comme cela...
OriginalL'auteur Secret Squirrel
Document XML ne peut pas avoir plus d'une racine éléments. Un élément root est requis. Vous pouvez faire une seule chose. Obtenez tous les
fragment
éléments et de les encapsuler dans un élément racine et de l'analyser avecXDocument
.Ce serait la meilleure et la plus facile d'approche que l'on pourrait penser.
OriginalL'auteur Vivek Jain