После прочтения LoadOptions.SetBaseUri становится очевидно, что LINQ to XML использует аннотации для достижения установки свойства BaseUri
. Это прискорбно, поскольку аннотация имеет внутренний тип System.Xml.Linq.BaseUriAnnotation
, к которому у вас нет доступа. Мое предложение было бы, возможно, установить вашу собственную аннотацию, которая будет использовать либо его значение, либо значение BaseUri
, если это не null
.
public class MyBaseUriAnnotation
{
public XObject XObject { get; private set; }
private string baseUri = String.Empty;
public string BaseUri
{
get
{
if (String.IsNullOrEmpty(this.baseUri))
return this.XObject.BaseUri;
return this.baseUri;
}
set { this.baseUri = value; }
}
public MyBaseUriAnnotation(XObject xobject)
: this(xobject, String.Empty)
{
}
public MyBaseUriAnnotation(XObject xobject, string baseUri)
{
if (xobject == null) throw new ArgumentNullException("xobject");
this.XObject = xobject;
this.baseUri = baseUri;
}
}
Затем вы можете использовать метод для добавления аннотации к XDocument
, который вы анализируете самостоятельно:
public static XDocument XDocumentFromString(string baseUri, string xml)
{
var xdoc = XDocument.Parse(xml);
xdoc.AddAnnotation(new MyBaseUriAnnotation(xdoc, baseUri));
return xdoc;
}
И тогда, когда вы захотите найти BaseUri
, вы можете использовать метод расширения, чтобы получить правильный BaseUri
:
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;
}