阅读了
LoadOptions.SetBaseUri之后,显而易见的是,LINQ to XML使用注释来设置
BaseUri
属性。不幸的是,该注释是内部类型
System.Xml.Linq.BaseUriAnnotation
,您无法访问。我的建议是可能要设置您自己的注释,该注释将使用其值或者如果它不是
null
则使用
BaseUri
的值。
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;
}