XmlElement to string conversion - c#

Is there some simple way to convert XmlElement to string ?

This will get the content of the element if the content is text:
element.Value
This will get the content of the element as XML:
element.InnerXml
This will get the element and its content as XML
element.OuterXml

You can look at the Value or InnerText properties of the element.
However, without further details of exactly what you are looking, I can't help more.
Update:
Seeing as you want the XML of all nodes, using InnerXml or OuterXml should do nicely.

Let's say you have this XmlElement:
<node>
Hello
<effect color="pink">
World
</effect>
</node>
With Console.Write(xmlElement.Inner) you see the inside of your node:
Hello <effect color="pink">World</effect>
With Console.Write(xmlElement.Outer) you get everything:
<node>Hello <effect color="pink">World</effect></node>
With Console.Write(xmlElement.Value) you get nothing, because Value always returns null for an XML element.

Related

InnerText XmlNode C#

I am trying to create an XMLDocument in C#. This is the file that I am trying to parse.
<root>
<child/>
some text here
</root>
However, when I try to assign the "some text here" to the element, I run into a problem.
In the beginning I have the XmlNode's
InnerText=""
and the XmlNode's
InnerXml=</child>
By doing
node.InnerText+="some text here";
my
InnerXml="";
I do not understand what am I doing wrong.
Note
If I have the following XML - where the text comes before the child, I have no issues.
<root>
some text here
<child/>
</root>
Rather than trying to manipulate the XML by changing the InnerXxx properties, you should do it by invoking AppendChild.
You'd want to append an XmlText element as a new child.

Replace OuterXml OR generate intended string from InnerXml

I have a UI that uses the DataGridView to display the content of XML files.
If XmlNode contains only InnerText, it's quite simple, however I'm having a problem with nodes that contains childnodes (and not only string).
Simple
<node>value</node>
Displayed as "value" in DataGridViewCell.
Complex
<node>
<foo>bar</foo>
<foo2>bar</foo2>
</node>
The problem is that the InnerXml code is not intended and it's very hard to modify in UI.
I've tried to use XmlTextWriter to "beautify" the string - it works quite well, however requires a XmlNode (includes node, not only childnodes) and I cannot assign it back to InnerXml.
I would like to either see following in the UI:
<foo>bar</foo>
<foo2>bar</foo2>
(this can be assigned to InnerXml afterwards)
Or
<node>
<foo>bar</foo>
<foo2>bar</foo2>
</node>
(and find a way how to replace OuterXml with this string).
Thanks for any ideas,
Martin
You can load the OuterXml to XElement, then use String.Join() to join all child elements of the root node (in other point-of-view, the InnerXml) separated by line break, for example :
XElement e = e.Parse(something.OuterXml);
var result = string.Join(
Environment.NewLine,
e.Elements().Select(o => o.ToString())
);

Add attribute without name and value?

Whether XML element attribute name can be empty:
<?xml version="1.0" encoding="utf-8"?>
<test>
<tables>
<gg qqq="">
<ss ""=""/>
<mm ""=""/>
</gg>
</tables>
</test>
I am getting an exception I cant to load this. Is this possible?
No, this will produce invalid XML. Attribute must have both name and value. How do you image opposite?
No this can not be done.
XML has empty element concept[If you are trying to implement that].
In that whole element is kept empty and said to be null as follow>>
<abc></abc>
<DefaultTaxPrice></DefaultTaxPrice>
Short answer, no. If you want to add value but not know what is the name of the value in XML, insert in into the body instead.
<ss>value</ss>
This way, your ss will be treated as a value

Why doesn't XDocument.Parse() parse my XML properly?

I am trying to use XDocument.Parse(string s) to parse some XML that is being returned from a REST based API. After the XML is parsed, it creates a new XDocument, but the document doesn't contain the properly parsed XML nodes. The name of the first node is the correct node name, but the value is the the concatenation of all the text from the XML, regardless of which Element is belongs to. Can anybody help me figure out what is going on?
XML
<sci_reply version="1.0">
<send_message>
<device id="00000000-00000000-00000000-00000000">
<error id="303">
<desc>Invalid target. Device not found.</desc>
</error>
</device>
<error>Invalid SCI request. No valid targets found.</error>
</send_message>
</sci_reply>
Debug View of XDocument Object
That's the expected behavior. The Value of a an XML element is concatenation of values of all its children. If you want to actually access the XML, read something about LINQ to XML or classes in the System.Xml.Linq namespace.
Thats just the debugger being nice.
The root is being displayed with all of its children.

How do I find a XML node by path in Linq-to-XML

If I get the path to a specific node as a string can I somehow easily find said node by using Linq/Method of the XElement ( or XDocument ).
There are so many different types of XML objects it would also be nice if as a added bonus you could point me to a guide on why/how to use different types.
EDIT: Ok after being pointed towards XPathSelectElement I'm trying it out so I can give him the right answer I can't quite get it to work though. This is the XML I'm trying out
<Product>
<Name>SomeName</Name>
<Type>SomeType</Type>
<Quantity>Alot</Quantity>
</Product>
and my code
string path = "Product/Name";
string name = xml.XPathSelectElement(path).Value;
note my string is coming from elsewhere so I guess it doesn't have to be literal ( at least in debug mode it looks like the one above). I've also tried adding / in front. It gives me a null ref.
Try using the XPathSelectElement extension method of XElement. You can pass the method an XPath expression to evaluate. For example:
XElement myElement = rootElement.XPathSelectElement("//Book[#ISBN='22542']");
Edit:
In reply to your edit, check your XPath expression. If your document only contains that small snippet then /Product/Name will work as the leading slash performs a search from the root of the document:
XElement element = document.XPathSelectElement("/Product/Name");
If there are other products and <Product> is not the root node you'll need to modify the XPath you're using.
You can also use XPathEvaluate
XDocument document = XDocument.Load("temp.xml");
var found = document.XPathEvaluate("/documents/items/item") as IEnumerable<object>;
foreach (var obj in found)
{
Console.Out.WriteLine(obj);
}
Given the following xml:
<?xml version="1.0" encoding="utf-8" ?>
<documents>
<items>
<item name="Jamie"></item>
<item name="John"></item>
</items>
</documents>
This should print the contents from the items node.

Categories