使用注释编写XDocument

时间:2010-08-22 11:36:38

标签: c# xml linq-to-xml

我有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 {Something}Name="Foo"/>
</Root>

我可以做类似的事情:

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

但这真的不是我想要的。

如果我能得到元素和属性的起始位置,那将是完美的。我正试图用以下方法实现:

http://blogs.msdn.com/b/mikechampion/archive/2006/09/10/748408.aspx

2 个答案:

答案 0 :(得分:4)

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

基本上,如果您希望XML表示中保留数据,则需要将其作为普通XML文档模型的一部分。

答案 1 :(得分:0)

问题解决了: - )

使用XDocument.Load(reader, LoadOptions.SetLineInfo),我可以在行上获得行号和位置:

var info = (IXmlLineInfo)element;

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