C# 写一份带注释的XDocument

C# 写一份带注释的XDocument,c#,xml,linq-to-xml,C#,Xml,Linq To Xml,我有一个XDocument,其中添加了一些注释(.AddAnnotation)。现在我想用这些注释写出文档。.ToString和.WriteTo都将丢弃注释,因此它们将无法工作。本质上,我需要一个自定义XML编写器,但是抽象类XmlWriter对元素和属性的注释没有任何概念。具体的问题是,我必须在使用特定注释的元素和使用属性的元素之前编写一些内容 我不必写每一个位(XMLWriter就是这样做的),而只处理我需要的两种情况(在元素之前加注释,在属性之前加注释)的解决方案将受到欢迎 我的一个部分解

我有一个
XDocument
,其中添加了一些注释(
.AddAnnotation
)。现在我想用这些注释写出文档。
.ToString
.WriteTo
都将丢弃注释,因此它们将无法工作。本质上,我需要一个自定义XML编写器,但是抽象类
XmlWriter
对元素和属性的注释没有任何概念。具体的问题是,我必须在使用特定注释的元素和使用属性的元素之前编写一些内容

我不必写每一个位(XMLWriter就是这样做的),而只处理我需要的两种情况(在元素之前加注释,在属性之前加注释)的解决方案将受到欢迎

我的一个部分解决方案是,要么将带有此特定注释的元素包装到另一个元素中,但这会弄乱XML,无法处理属性。另一种解决方案是将注释替换为
XComment
',而不是在元素和属性的元素之前。但之后我将不得不替换这些评论。我可能会使用最后一种解决方案,但可能已经有注释,这些注释可能与我应用注释的格式相同

例如:

var annoAtt = new XAttribute("Name", "Foo");
annoAtt.AddAnnotation(new Foo());

var doc = new XDocument(
            new XElement("Root",
                new XElement("Some",
                    annoAtt))));
然后我希望将其作为输出(不是有效的XML,但我不需要):


我可以做一些像:

<Root>
   <Some my:Something="Name ..." Name="Foo"/>
</Root>

但那真的不是我想要的

如果我能得到元素和属性的起始位置,那就太完美了。我正试图通过以下方式实现这一点:


鉴于注释是任意对象,因此它们不会被写出也就不足为奇了。它们实际上不是XML文档模型的一部分——它们只是LINQ对XML的补充。您需要在注释中保留什么?如果只是字符串数据,您可能希望创建一个属性(可能在您自己的名称空间中,这样很容易避免冲突)。诚然,如果您想向文本节点添加注释,这可能会很棘手,但您可以很容易地将它们添加到元素和属性中。(有两种不同类型的属性,其中一种指定作为其数据的一部分应用于哪个属性。)


基本上,如果您希望数据在XML表示中持久化,它将需要成为普通XML文档模型的一部分。

鉴于注释是任意对象,因此它们不会被写出也就不足为奇了。它们实际上不是XML文档模型的一部分——它们只是LINQ对XML的补充。您需要在注释中保留什么?如果只是字符串数据,您可能希望创建一个属性(可能在您自己的名称空间中,这样很容易避免冲突)。诚然,如果您想向文本节点添加注释,这可能会很棘手,但您可以很容易地将它们添加到元素和属性中。(有两种不同类型的属性,其中一种指定作为其数据的一部分应用于哪个属性。)

基本上,如果您想在XML表示中持久化数据,它需要是普通XML文档模型的一部分。

问题已解决:-)

使用
XDocument.Load(reader,LoadOptions.SetLineInfo)
我可以通过以下方式获取行的行号和位置:

var info = (IXmlLineInfo)element;
我需要的东西可以注入这些信息

问题解决:-)

使用
XDocument.Load(reader,LoadOptions.SetLineInfo)
我可以通过以下方式获取行的行号和位置:

var info = (IXmlLineInfo)element;

我需要的东西可以注入这些信息

请看我想要的示例。请看我想要的示例。那么你是在问如何让Linq to XML输出无效的XML吗?我称之为自定义输出,但是;-)或者给我一个元素或属性的文本位置。那么你是在问如何让Linq to XML输出无效的XML吗?我称之为自定义输出,但是是;-)或者给我元素或属性的文本位置。