4

Hi I am writing an app for a medical study they will type in the gender, the age, and some other values which will be calculated to a ResultValue

now I have an XML file which holds some information about the result in combination of Age, Gender and the ResultValues and I would like to print out the description of the TestResult (in case in which group the proband belong) One thing to note is that I have to deal with value ranges this means the actual value lies between the low part and the high part... I have three groups... OK hier is my XML file

<?xml version="1.0" encoding="iso-8859-1"?>
 <Result>
        <ID>1</ID>
        <Description>You belong to Group 1</Description>
        <Genders>
            <Gender type="female">
                <Ages>
                    <Age low="18" high="24">
                        <ResultValue low="0" high="19"/>
                    </Age>
                    <Age low="25" high="34">
                        <ResultValue low="0" high="20"/>
                    </Age>
                    <Age low="35" high="44">
                        <ResultValue low="0" high="21"/>
                    </Age>
                    <Age low="45" high="54">
                        <ResultValue low="0" high="22"/>
                    </Age>
                    <Age low="55" high="64">
                        <ResultValue low="0" high="23"/>
                    </Age>
                    <Age low="65" high="110">
                        <ResultValue low="0" high="24"/>
                    </Age>
                </Ages>
            </Gender>
            <Gender type="male">
                <Ages>
                    <Age low="18" high="24">
                        <ResultValue low="0" high="19"/>
                    </Age>
                    <Age low="25" high="34">
                        <ResultValue low="0" high="20"/>
                    </Age>
                    <Age low="35" high="44">
                        <ResultValue low="0" high="21"/>
                    </Age>
                    <Age low="45" high="54">
                        <ResultValue low="0" high="22"/>
                    </Age>
                    <Age low="55" high="64">
                        <ResultValue low="0" high="23"/>
                    </Age>
                    <Age low="65" high="110">
                        <ResultValue low="0" high="24"/>
                    </Age>
                </Ages>
            </Gender>
        </Genders>
    </Result>
    <Result>
        <ID>2</ID>
        <Description>You belong to Group 2</Description>
        <Genders>
            <Gender type="female">
                <Ages>
                    <Age low="18" high="24">
                        <ResultValue low="19" high="24"/>
                    </Age>
                    <Age low="25" high="34">
                        <ResultValue low="20" high="25"/>

                    </Age>
                    <Age low="35" high="44">
                        <ResultValue low="21" high="26"/>
                    </Age>
                    <Age low="45" high="54">
                        <ResultValue low="22" high="27"/>
                    </Age>
                    <Age low="55" high="64">
                        <ResultValue low="23" high="28"/>
                    </Age>
                    <Age low="65" high="110">
                        <ResultValue low="24" high="29"/>
                    </Age>
                </Ages>
            </Gender>
            <Gender type="male">
                <Ages>
                    <Age low="18" high="24">
                        <ResultValue low="19" high="24"/>
                    </Age>
                    <Age low="25" high="34">
                        <ResultValue low="20" high="25"/>
                    </Age>
                    <Age low="35" high="44">
                        <ResultValue low="21" high="26"/>
                    </Age>
                    <Age low="45" high="54">
                        <ResultValue low="22" high="27"/>
                    </Age>
                    <Age low="55" high="64">
                        <ResultValue low="23" high="28"/>
                    </Age>
                    <Age low="65" high="110">
                        <ResultValue low="24" high="29"/>
                    </Age>
                </Ages>
            </Gender>
        </Genders>
    </Result>
    <Result>
        <ID>3</ID>
        <Description>You belong to group 3</Description>
        <Genders>
            <Gender type="female">
                <Ages>
                    <Age low="18" high="24">
                        <ResultValue low="24" high="29"/>
                    </Age>
                    <Age low="25" high="34">
                        <ResultValue low="25" high="30"/>

                    </Age>
                    <Age low="35" high="44">
                        <ResultValue low="26" high="31"/>
                    </Age>
                    <Age low="45" high="54">
                        <ResultValue low="27" high="32"/>
                    </Age>
                    <Age low="55" high="64">
                        <ResultValue low="28" high="33"/>
                    </Age>
                    <Age low="65" high="110">
                        <ResultValue low="29" high="34"/>
                    </Age>
                </Ages>
            </Gender>
            <Gender type="male">
                <Ages>
                    <Age low="18" high="24">
                        <ResultValue low="24" high="29"/>
                    </Age>
                    <Age low="25" high="34">
                        <ResultValue low="25" high="30"/>
                    </Age>
                    <Age low="35" high="44">
                        <ResultValue low="26" high="31"/>
                    </Age>
                    <Age low="45" high="54">
                        <ResultValue low="27" high="32"/>
                    </Age>
                    <Age low="55" high="64">
                        <ResultValue low="28" high="33"/>
                    </Age>
                    <Age low="65" high="110">
                        <ResultValue low="29" high="34"/>
                    </Age>
                </Ages>
            </Gender>
        </Genders>   
    </Result>

What would look my linq to xml query like if I have

gender="female"

age=29

ResultValue=17

this proband would certainly belong to Group 1 and I would like to print out the matching Description...

But I am banging my head to get this working...

I am looking for a solution in c#... Any help would be great!!!

2
  • Are you looking for a VB.Net LINQ to XML query or a C# one. Very different answers. Commented Jan 8, 2009 at 17:19
  • Oh I'm sorry! I am looking for a c# solution... Commented Jan 8, 2009 at 17:26

1 Answer 1

6

Something like this?

XElement myElement = XElement.Parse(xmlstring);

int resultValue = 17;
int age = 26;
string genderValue = "female";

IEnumerable<string> query =
    myElement.Descendants("ResultValue")
        .Where(rv => ((int)rv.Attribute("low")) <= resultValue)
        .Where(rv => ((int)rv.Attribute("high")) >= resultValue)
        .Where(rv => rv.Ancestors("Age")
            .Any(a => ((int) a.Attribute("low")) <= age && ((int) a.Attribute("high")) >= age)
        )
       .Where(rv => ((string)rv.Ancestors("Gender").Single().Attribute("type")) == genderValue)
       .Select(rv => rv.Ancestors("Result").Single().Element("Description").Value);

    foreach (string x in query)
        Console.WriteLine(x);

The idea is that you can imagine a row-column shape where each row is a ResultValue. Each result value has a single parent of Age, a single parent of Gender, an a single parent of Result.

ResultValue.Low ResultValue.High Age.Low Age.High Gender.Type Result.Description

In fact, one can project the above xml into that shape:

        var query2 = myElement.Descendants("ResultValue")
            .Select(rv => new 
            {
                ResultValue = rv,
                Age = rv.Ancestors("Age"),
                Gender = rv.Ancestors("Gender"),
                Result = rv.Ancestors("Result")
            })
            .Select(x => new XElement("Data",
            new XAttribute("ResultValue.Low", (int)x.ResultValue.Attribute("low")),
            new XAttribute("ResultValue.High", (int)x.ResultValue.Attribute("high")),
            new XAttribute("Age.Low", (int)x.Age.Attributes("low").Single()),
            new XAttribute("Age.High", (int)x.Age.Attributes("high").Single()),
            new XAttribute("Gender.Type", (string) x.Gender.Attributes("type").Single()),
            new XAttribute("Result.Description", (string) x.Result.Elements("Description").Single())
            ));
        foreach (XElement x in query2)
            Console.WriteLine(x);
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.