6
votes

Puis-je attribuer une baseuri à un xdocument?

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, xxx

si je crée un nouveau xdocument à partir de zéro, il n'a pas de baseeur. Par exemple: xxx

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.


0 commentaires

4 Réponses :


2
votes

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;
}


2 commentaires

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.



4
votes

Autant que je puisse dire, vous ne pouvez pas le faire facilement. Vous pouvez le faire lorsque vous chargez avec n'importe quel xmlreader si vous définissez l'option appropriée. Cela signifie que vous pourrait écrire une méthode d'extension qui l'a sauvegardée à un Morthstream puis chargé un nouveau document à partir d'une classe personnalisée dérivée de xmltextreader quelle surcharge Code> baseuri . Ce serait assez moche cependant: (


0 commentaires

3
votes

Le moyen laid mais le plus rapide: xxx


1 commentaires

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.



1
votes
 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);

0 commentaires