views:

54

answers:

2

Hi,

I have a XDocument where I have added some annotations (.AddAnnotation). Now I want to write the document out with these annotations. Both .ToString and .WriteTo will discard annotations so they will not work. Essentially, I need a custom XML writer but the abstract class XmlWriter don't have any notion about annotations on elements and attributes. The specific problem is that I have to write some stuff before an element with a specific annotation and the same thing with attributes.

A solution where I don't have to write every single bit (which the XMLWriter do) but only handles the two cases I need (before elements with a annotation and before attributes with a annotation) will be appreciated.

A partially solution I have is to either wrap the elements with this specific annotation in another element but this mess up the XML and do not work on attributes. Another solution is to replace the annotations with XComment´s instead before elements for both elements and attributes. But then I would have to replace the comments afterwards. I might go with the last solution but there could be comments already which potentially could have the same format I'm applying the comments.

Example:

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

var doc = new XDocument(
            new XElement("Root",
                new XElement("Some",
                    annoAtt))));

I then wants this as the output (not valid XML but I don't need that):

<Root>
   <Some {Something}Name="Foo"/>
</Root>

I could make something like:

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

but that is really not what I want.

If I could get the start position of elements and attributes it would be perfect. I'm trying to implement that with:

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

+2  A: 

Given that annotations are arbitrary objects, it's not surprising that they're not written out. They're not really part of the XML document model - they're just additions for LINQ to XML. What do you need to persist in the annotations? If it's just string data, you might want to create an attribute instead (perhaps in your own namespace, so it's easy to avoid conflicts). Admittedly that could be tricky if you want to add annotations to text nodes, but you could reasonably easily add them to both elements and attributes. (Have two different kinds of attribute, one of which specifies which attribute it applies to as part of its data.)

Basically if you want data persisted within the XML representation, it will need to be part of the normal XML document model.

Jon Skeet
Please see example of what I want.
lasseespeholt
A: 

Problem solved :-)

With XDocument.Load(reader, LoadOptions.SetLineInfo) I can get line number and position on the line with:

var info = (IXmlLineInfo)element;

And the stuff I need can be injected with these informations

lasseespeholt