在阅读LoadOptions.SetBaseUri之后,很明显LINQ to XML使用Annotations来实现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;
}
谢谢,我没有想过用注释的 – 2009-09-17 20:02:08
您还可以延长我的例子,搜索起来。 XObject层次结构,直到找到MyBaseUriAnnotation以便与XObject.BaseUri的行为相同。 – user7116 2009-09-17 20:25:58