2

i'm using a platform that does allow XML, but not Linq, so I will have to parse the XML without XElement and XDocument, so what should I use instead of these two? I also found a code, if someone could explain me how to convert it

// parse the document (this is your doc but I've made the xml parseable)
var doc = XDocument.Parse(@"<chars>
        <character name=""MyChar1"">
        <skill1 type=""attack"" damage=""30"">
            description of skill1
            <name>Skill name</name>
            <class1 type=""The Class Type""></class1>
            <class2 type=""The Class Type 2""></class2>
        </skill1>
        </character>
    <character name=""MyChar2"">
        <skill1 type=""attack"" damage=""30""></skill1>
    </character>
</chars>");

// Access a skill1 type(attribute) where the name(attribute) is "MyChar" 
// this is pretty easy with LINQ. We first get all descendant nodes of type "character"
var skillWhereNameIsMyChar1 = doc.Descendants("character")
    // then take the single one with an attribute named "value"
    .Single(ch => ch.Attribute("name") != null && ch.Attribute("name").Value == "MyChar1")
    // and take that element's child element of type skill1 
    .Element("skill1");
// this will print <skill1 ... /skill1>. However, this is an XElement object, not a string
// so you can continue to access inner text, attributes, children etc.
Console.WriteLine(skillWhereNameIsMyChar1);

// 2. Access the description of skill1 where name(att) is "MyChar1"
// this is tricky because the description text is just floating among other tags
// if description were wrapped in <description></description>, this would be simply
// var description = skillWhereNameIsMyChar1.Element("description").Value;
// here's the hacky way I found to get it in the current xml:

// first get the full value (inner text) of the skill node (includes "Skill Name")
var fullValue = skillWhereNameIsMyChar1.Value;
// then get the concatenated full values of all child nodes (= "Skill Name")
var innerValues = string.Join("", skillWhereNameIsMyChar1.Elements().Select(e => e.Value));
// get the description by dropping off the trailing characters that are actually inner values
// by limiting the length to the full length - the length of the non-description characters
var description = fullValue.Substring(0, length: fullValue.Length - innerValues.Length);
Console.WriteLine(description);
John Saunders
  • 160,644
  • 26
  • 247
  • 397
user2624407
  • 159
  • 1
  • 11
  • What do you mean "does allow XML"? XML is plain text, so it is very hard to imagine platform that disallows using text files... – Alexei Levenkov Jul 26 '13 at 22:18
  • This looks like something you could make an XSD for, then use `xsd.exe` to generate strongly-typed classes with proper serialization attributes. Should be less error-prone than parsing it yourself. – Cory Nelson Jul 26 '13 at 22:19
  • @AlexeiLevenkov hmm i'm using a platform that provides a webserver, that sends message to clients, and can be configured in C#, lately they added XML to their whitelist, but yesterday I realised XML.Linq is not on the whitelist, ha so ironic.. so I need another way – user2624407 Jul 26 '13 at 22:21
  • @CoryNelson does this generate a code to parse XML ? :P – user2624407 Jul 26 '13 at 22:36

1 Answers1

2

You need to use System.Xml.XmlDocument instead of System.Xml.Linq.XDocument. In addition, you need to make use of XPath in order to find your specified element. XPath is a little complex to learn if you're not familiar with; instead, check this link: The answer of that post offers a very simpler way to access XML attributes: Read XML Attribute using XmlDocument

Community
  • 1
  • 1