Lorsque je charge un document XML à partir du disque dans un XDocument, XDocument dispose d'une base de propriétés prête à l'emploi contenant l'emplacement du document XML d'origine sur le disque. En d'autres termes, si je crée un nouveau xdocument à partir de zéro, il n'a pas de baseeur. Par exemple: p> puis-je attribuer ce nouveau xdocument un baseeur? J'aimerais pouvoir générer de nouveaux documents, leur attribuer des noms et transmettre facilement ces noms avec eux. P> P>
4 Réponses :
Après avoir lu loadoption.setbaseuri Il est évident que LINQ to XML utilise des annotations pour obtenir le réglage de la propriété baseuri code>. Ceci est regrettable que l'annotation est du type interne
system.xml.linq.baseuriannotation code>, que vous n'avez pas accès à. Ma suggestion serait peut-être de définir votre propre annotation qui utiliserait sa valeur ou la valeur de
baseuri code> si ce n'était pas
null code>.
public static string FindBaseUri(this XObject xobject)
{
if (xobject == null) throw new ArgumentNullException(xobject);
var baseUri = xobject.Annotation<MyBaseUriAnnotation>();
return baseUri != null ? baseUri.BaseUri : xobject.BaseUri;
}
Merci, je n'avais pas pensé d'utiliser une annotation.
Vous pouvez également étendre mon exemple pour rechercher la hiérarchie XOBJECT jusqu'à ce qu'elle ait trouvé une mybaseuriannotation afin de se comporter de manière identique à xObject.baseuri.
Autant que je puisse dire, vous ne pouvez pas le faire facilement. Vous pouvez le faire lorsque vous chargez avec n'importe quel xmlreader code> si vous définissez l'option appropriée. Cela signifie que vous pourrait em> écrire une méthode d'extension qui l'a sauvegardée à un
Morthstream code> puis chargé un nouveau document à partir d'une classe personnalisée dérivée de
xmltextreader code> quelle surcharge Code> baseuri code>. Ce serait assez moche cependant: ( p>
Le moyen laid mais le plus rapide:
Comparé à la tentative de création d'une double valeur (une définie par vous-même, et une par le système, comme dans la réponse acceptée originale), c'est beaucoup mieux (à condition que vous mettez en cache la méthodeInfo). Bien sûr, ce serait encore mieux si Microsoft expose cette méthode publiquement.
public class CustomXmlDocument : XmlDocument { public string CustomBaseURL { get; set; } public override string BaseURI { get { return this.CustomBaseURL; } } } CustomXmlDocument objXML=new CustomXmlDocument(); objXML.CustomBaseURL="BaseURI"; objXML.loadXml(xml document);