First question on SO, apologies if I mess some of this up. I'm new to c# and LINQ and have spent the past 2 days searching SO for a solution, none seem to be exactly what I'm after. So...
The xml file I'm querying is generated from a DICOM Structured Report file. I'm trying to get specific values of elements from this xml file. These elements correspond to specific measurements that were taken during an ultrasound examination. The entire xml file is 15k lines long so for simplicity I've edited it. I'll just show one example of what I'm trying to do but the process will be the same for all other elements I'm looking to get.
The element I want to get has to meet 3 criteria, in this case Tricuspid Valve, Peak Velocity and Regurgitant Flow but this changes depending on the measurement that was taken. Once those criteria are met I want to get the value of , which in this case is 2120.
The xml
<report type="Comprehensive SR">
<document>
<content>
<container flag="SEPARATE">
<container flag="SEPARATE">
<code>
<meaning>Tricuspid Valve</meaning>
</code>
<container flag="SEPARATE">
<num>
<concept>
<meaning>Peak Velocity</meaning>
</concept>
<code>
<meaning>Regurgitant Flow</meaning>
</code>
<value>2120</value>
<unit>
<value>mm/s</value>
</unit>
</num>
My code in c#
XDocument xmlSR = XDocument.Load("DICOMSRtest.xml");
var TRVmax = from c in xmlSR.Descendants("container")
where (string)c.Element("code").Element("meaning") == "Tricuspid Valve"
where (string)c.Element("concept").Element("meaning") == "Peak Velocity"
where (string)c.Element("code").Element("meaning") == "Regurgitant Flow"
select c.Element("container").Element("num").Element("value");
Console.Write("TRVmax: " + TRVmax);
When I run the code I get the following
TRVmax: System.Linq.Enumerable+WhereSelectEnumerableIterator`2[System.Xml.Linq.XElement,System.Xml.Linq.XElement]
Any help or direction to some documentation which I can read to solve this would be greatly appreciated.
Try following :
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
XDocument doc = XDocument.Load("PurchaseOrder.xml");
List<XElement> xContainers = doc.Descendants("container").Where(x => x.Element("num") != null).ToList();
List<Container> containers = new List<Container>();
foreach (XElement xContainer in xContainers)
{
Container newContainer = new Container();
containers.Add(newContainer);
newContainer.code = (string)xContainer.Descendants("code").FirstOrDefault();
newContainer.concept = (string)xContainer.Descendants("concept").FirstOrDefault();
newContainer.value = (int)xContainer.Descendants("value").FirstOrDefault();
newContainer.unit = (string)xContainer.Descendants("unit").FirstOrDefault();
}
}
}
public class Container
{
public string code { get; set; }
public string concept { get; set; }
public int value { get; set; }
public string unit { get; set; }
}
}
Related
I have an XML-encoded attribute value. This is actually from a processing instruction. So the original data looks something like this:
<root><?pi key="value" data="<foo attr="bar">Hello world</foo>" ?></root>
I can parse it like this:
using System;
using System.Linq;
using System.Xml.Linq;
public class Program
{
private const string RawData = #"<root><?pi key=""value"" data=""<foo attr="bar">Hello world</foo>"" ?></root>";
public static void Main()
{
XDocument doc = GetXDocumentFromProcessingInstruction();
IEnumerable<XElement> fooElements = doc.Descendants("foo");
// ...
}
private static XProcessingInstruction LoadProcessingInstruction()
{
XDocument doc = XDocument.Parse(rawData);
return doc
.DescendantNodes()
.OfType<XProcessingInstruction>()
.First();
}
private static XDocument GetXDocumentFromProcessingInstruction()
{
XProcessingInstruction processingInstruction = LoadProcessingInstruction();
// QUESTION:
// Can there ever be a situation where HtmlDecode wouldn't decode the XML correctly?
string decodedXml = WebUtility.HtmlDecode(processingInstruction.Data);
// This works well, but it contains the attributes of the processing
// instruction as text.
string dummyXml = $"<dummy>{xml}</dummy>";
return XDocument.Parse(dummyXml);
}
This works absolutely fine, as far as I can tell.
But I am wondering if there might be some edge cases where it may fail, because of differences in how data would be encoded in XML vs. HTML.
Anybody have some more insight?
Edit:
Sorry, I made some incorrect assumptions about XProcessingInstruction.Data, but the code above was still working fine, so my question stands.
I have nonetheless rewritten my code and wrapped everything in an XElement, which (of course) removed the issue altogether:
private static XDocument GetXDocumentFromProcessingInstruction2()
{
XProcessingInstruction processingInstruction = LoadProcessingInstruction();
string encodedXml = string.Format("<dummy {0} />", processingInstruction.Data);
XElement element = XElement.Parse(encodedXml);
string parsedXml = element.Attribute("data").Value;
return XDocument.Parse(parsedXml);
}
So this does exactly what I need. But since WebUtility.HtmlDecode worked sufficiently well, I would still like to know if there could have been a situation where the first approach could have failed.
Removing the question marks and adding a forward slash at end of your input I got this
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
string input = "<pi data=\"<foo attr="bar">Hello world</foo>\" />";
XElement pi = XElement.Parse(input);
string data = (string)pi.Attribute("data");
XElement foo = XElement.Parse(data);
string attr = (string)foo.Attribute("attr");
string innertext = (string)foo;
}
}
}
I have this XML File
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<Mobiles>
<Mobile ID="98a2d0b9c2661725a7486423ebd94abdef53ed89051ff5ac7a9c63a4b2a99d7a" RegDate="26/05/2017">
<FullName>Galaxy S-4</FullName>
<Vendor>Samsung</Vendor>
<Date>2010</Date>
<Price>30000SYP</Price>
<Weight>5g</Weight>
<Features>All</Features>
<Notifecations></Notifecations>
<Picture>/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCADCAQQDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD3+iiigAooooASio5JVhjZ3dVVV3MzHAAHUk1y+oeMNg/4l9urJ/DNMSFPuqjlh9dvtmmlcLnW0V5Xe+O9aT7lxAv/AFzhA/8AQi1Ydz8SdfT7l8v/AH5j/wDiar2UiedHuFFfPWn/ABQ8V6vtS2u0jlbO1Zlij6epbCj8+vFaB8W/ED+C+0//AMCLb/4qlyMdz3WivCT4p+JX/P1p3/gRbf8AxVc7f/F3xtpt89lcXdr5q/e2xo46A9VODwR0NP2bC59L0tfL8Xxz8Y+Xu86z/wCBWo/oa0rP45+KfvzQ6ZKq/KzfZ3HJzgEhuOh/I0ezYuZH0bS15P4a+NFlqE62+t2i2O75Vuo2LRZ/2gRlR7/MB3Ir1VW3AMp+Wpaa3GncfRRWF4k8WaL4TsPtmsXq26M2I05Z5T6Ko5P8h3xSGbtFeLT/ABy1G/fHhzwfeXkP/PaZjn8VjVgP++qr/wDCy/idLIzJ4Wso0z8qtY3DMPx3jP5CnZge40V4cPiD8T3/AOYNYp/3D5v6yU7/AIT34m/9Ay0/8Fsn/wAdo5WB7fRXh3/CwPiV/wBAyz/8Fsn/AMdp3/Cw/iP/ANAyx/8ABbN/SWjlYHt9FeGf8LN+IkLrv0bT5V7r9huFJHpnecfXBq9qHxc8SJtax8KSt8x3LNHINo9AR1P4Dp74BysD2WivF7L47tbTrF4j8NXNivTzoZN/1O1gpx9CTXqei67pfiLT01DSb2K7tX6PH2PowPKnkcEA0WA1aKKKQBRRRQAUUUUAFFFFABRRRQBy/jCf9xa2f8ErGSVfVVxgH23FfyrgNTvvv/PXVeP53hf5H2t9jk2tx8pyOeeO1Yd34asnkbfd33/fUf8A8RXVQjdaHPVkk9Thr29/2/8AP5VhXFxXoFx4R0r/AJ+L7/v4n/xNZsvg7SP+et5/3+X/AOJrqWHm+hzPEwXU5LTbbSr+O4/tDUPszrJAse6RFDI0m2Q4KksVXkAYA6njq+fR/DCQK66yzO0yrt3Rj92ZgueV+8I8sc4GeeBkVuyeDtI/v3n/AH+H/wATVV/CWlf37z/v8P8A4mn9TqsX12kjAbR/D3mfPqf/AC0kT5ZEPAlKqc7RwV2tnAzyR0rnr2C3hjt/s77t0IaT5gdrEDIwAMYORjk8Z7127+FdK/v3P/f4f/E1C3hTSP8Ap5/7/D/4mqWBrCeYUTzxxTRK6Js3ts+8y9sjvivQT4R0b/p5/wC/3/1q0J/h94ehgsn+0Tfv4d7fvQNh4+XOf9rvjp+U1MPUhKMZbvb5DjjaL2Z51Z3jpJX1B8IdXfUvBMMUrbmtGMIP+yCdo/AV49N4G8PRWlxKtxJviVyq+f8AexjB/HJOPbr6d5+zzO0vhvVg/wDBdL+qA1y4im4LU6qNaNT4T2RjxXzTb3afEHxzd63qb7tPiy0Ub9FhBwiY7ZHzN6nNfQ2uS+T4f1KX+5ayt+SE18ueH5XtvD935Xy/6PH/ADI/rXPA2kd9qXxESz/0LSbeJYovlX5QBx6Csc/ETV/78X/fsVw/nUeb/n8K15UTc7b/AIWBq/8Afi/75Fb2geJdQv8AbLdzM27d5VvbKvmOFGWYlsKqjgFmIGSBnkZ8r86tNNXl074f394n/Hw9/HYK3PyoInlHf+82fwX0qZaDR7DJ4m0pJPs+xvN/hVdQg3sfQBmC5/GuZ13xTqWmyb7S482LdsZZIwskTcHaw+hyCOCCCMggnxq60e6fRv7UuJZG/drL5jfcbc2Aqnuw5yO2K6F7yV/CugXDtue5WaGRmzkiF12Hr1xIwz3wPSoW5TOtHj/Vf+mX/fIqRfiLqSfwRN/wEVwnm0ebWvKiLnq1n4u03xJA+m6tYxfvV/iXIb6ehrA8F6hL4K+J8WnxS/8AEvvphbTL2feP3Tf7wZlGfQt61xsNw6To6P8AOrVp3szf8Jfpsu/5lu7Nv/H1NJxHc+rqKKKwLCiiigAooooAKKKKACiiigDzX4lz7J1i/wCnU/qW/wDiTUVxP+8eofikf+JinvaqP/HpKCm+SX59u1S/5cD9SB+NepgkuVtnl4+VmkitLLVKV60orV5vm+zyMqxtK21vvYB2jgcAsMc++OlZ81u3zSqjeUrHbuYZxnGcd+SASBjJr0oTjex5M3JK5RlaqcrVomxnfZtT72WX5lHABJJyRgYVuTgcHnimnR79vu2sjdV+XkcdeR2756YBPY10qdNbyX3nJJ1HtF/cYkhqE761xpV08creT8sTMrfMByoywwTyQOcCk/sq6adYFt2adv8AlmuCfoQDwfY81uqtL+ZfeczdR/Zf3GPh6XD1srpM/wA8X2WTz/MRF+YAZflRjvkdMH60Lod++7yrR5FXHzRsGHIyCCCQRjuD7dan21LuvvDkq9Iv7jDmZ/Il/wCuZ/ka679nH/kXNa/6/F/9AFc1PD+4l/65n+Rrpf2cv+Rc1v8A6/F/9AFePnO8T6DIpc0Z/I9W8S/8iprH/XlN/wCgGvl7Rf8AkW9Q/wCveL/0KvqHxL/yK2r/APXlN/6A1fLujn/im9S/69Y/4v8AbrxoHuSMXzKPMqvu/wA7qN3+d1bkljzKsWOpWS297ouseYul3zJL9ohXc1tOmQrgHqCCVYdSMY5FZ+7/ADupsp/dv8m75flXdUyV0Cdi1Lonh3hU8ZrLAvzbfsMqkeuFYgE/Q1LqGp29++n2un27QaVpsJig8z70rMcvI2B1Y447ACvVdT8E+D7fwPqV/aQwNcQ2G+CTzPm8wR5DZ6k57ZOc9DXju7/O6ogr6lNljzKN1V93+d1G7/O6tSS1G/7xP96tnUZkh123uH+5FJau3rgbWOPwFc9Gf3if/FVp66f38v8Auxfxf7IpMD7EooormNAooooAKKKKACiiigAooooA8m+LB/4mVv8A9cY//QpKmDtDJL8ituXDbs9NwPYjuoqr8XT/AMTGyH95Y/8A0KStKGFZb1Ym3bWkC/KwHU4zyDXp4Jr2crnh5q2pwUd3cpFz5LKy/N5XlIyqB1kEhz6dxx7cVFLLK0CwNt2xrheo/iJ5Gduck84z78nNy3RZk3yqypt3NL5gAQ4yoxt5JPGMg02G2R5F3v8AuuN7Kpzz2GepP5dT0BrvUqSvfpqeLOVeVrPfQzzK/wDzwhb92Im3b/nUKFGcHjgD7u3nrmk+0XHz/wCq+Zi7fL67eMdMAIBj0JFan2SPe0W0SSeYUSMzrGWHQEAgkkn0xUa21VB0ZX0OarPEwSd9+xSnkaaBE+VX/e7tq9N+AwXOcAgDPc85Jyckk1xLJ5vlQKyyO67Vb5S+cnlj3JPrnHYADRFrS/ZKpKkuhPt8Q+vYykkuIduyKD5di/dPOxCi7sHJ+Vj0x0GMVGJLhH3IsfyshVdpwuxSFXrnGGbvnPOc1sG0qNraqSpPoL2uIX2jmLu2/cXDbFX92zfKuB0PQdhVv9nNsaJqqetzn8kT/Gr97bf6Dcf9cW/9BNZ/7Of/ACBtT/6+D/6BHXn5pK/Ke/w8moVL91+p6v4tlaHwdrUq9VsZj/44a+W9MbZ4f1D/AK94/wD0Ovp7xx/yIWv/APYPn/8AQDXy/p//ACAr3/r3j/8AQ68uB9BIw80uajorcgkz/vUbqn0/TrrVZ3gtFRmSMytukVAFHUksQAOnf36AkWYfDutXMEVxFZStFLbtdRt5ifNEpUFsbs9XX5cbjuGAaV0gs2UTNL5ezfLsX+Hccfl0puavXGharbRyyy2+1YpGRm+0RHlE3sBhvmAUg5XIwRzyKVvD2rrJseybf5nk/wCsj+8JBHt+9x87BfTqegJC5kFmUM0bv96iWGWGR4pfvL/dkVhzz1UkH8DUdMCaM/vE/wB6tHxEf+Pr/rnH/wCgCsuL/Xp/vVpeIut5/wBc4/8A0AUmNH2VRRRXMahRRRQAUUUUAFFFFABRRRQB5F8Y/kutKYfeaRV/DLf4mtVPlnVlbaytlW44OevNZHxoP+laJ/13T+bVPLrlqk7rsZvmPzdEY/Xk498V6eCTdOVjwM3TdWnb+tiV9Qsra4WyluIF2qWXcvC9A3zYxnGOOvFWo2ZdjxXTL8oZfLkKg+mccH8a81ubGX+0riCZdl0zF9vXfn5htPfIOR65/Cuq0TWrfTfBK3Vxul8qZ4VjXq2BuAz2GCefpXNDHwd7vRb6bH0uZ8JRo4WnVwc3ObaVu9+qOlXzN+7zd0md+5sFsnnPPv65Ax0p6Q1y+meObe8n/wBLt1tot2GbzN2z3JIGR+Vdjay29zu+zyxS7fvbWzt+orpoYqlVTdN3PlcxybG4CcYYqNr7ap37jUgqUW9XEhqdYK0lVMYYUyzbVE9rW8ttSPZVKxBo8DdHI6hb7LG4/wCuLf8AoJrA/Zy/5FzVf+vz/wBkSu31a12abd/9cZP/AEE1w/7OX/It6r/19/8AsiVz4upzWPQyql7JTXoereJokm8K6xHKiujWUwZW5BGw9RXyjph/4kV7/wBesf8AD/tV9Y+If+Ra1X/rzm/9ANfJmmf8gK6/69V/9CrmgenIxc/520f5+7R8/wDlqK3Mizp2oXGlX0V7aeUtxE26NmhV9p6ggMDgjHUc/rV628T6xZ+V9nu9qRxhI/3KnCgRDbyOn+jxZ9cH+82ciik0mVdmqPEepeRLFvg2SyCWbdaoS5CFMMccrtJGPc+ppv8AwkOq7932tv8AXCf5owdziQyAnI5+ZmOOhzzwBjLpaOVdhczJ7y8lv7t7q42tK2N37vA4AAAA6AAAfhUGf87aP8/eopiuPi/1if7392t28RZtdSKVFaKWa3Rl2/eB2gj8jWFD/r1/3q3rn/kYF/6+Lf8AmtSxo+v6KKK5jcKKKKACiiigAooooAKKKKAPGvjcB5+h7vufaFDfT5uaoanA9nJsf+L5o27OD3B71c+Ov39D/wCvhf8A2atbwpPLc2V1C/zRRyYXdyMnkjn8KipnUcss6kbxd723MsRk7x1CVWMrSi1vs0yppWmWt/YWt/fOu5V2RSMwHAZivXvz+lV/HP8AZum+G0t/s6xXE9wZYVhUKGO3DM2PYj8dvasLxXZ29zq1xcXdwqyxMUjhboiDhQoH3RjB985rmbqzuHS1ihu45IvM2RQ+YSELHsP4QTjP59qwqZNiJSljadTmU7tq2lnqreaLyfOqcMXSoV21GDte73X6EFrbS390lrEyq0rbdzenc++K7Gw8Q3v/AAkH/Evii2wM0S+Zk7+x3YPTI/QVxkMdxZztK/yyxZZVVsnI78dh1/Cren372epRXFvKzPu/eeZ/Hk/MD9ayp4qeCw04Rh78tm9j7HNcujneIhiKdRShTTsv73n8j6AsbpLmOJ3h8rzVH8WeT2/OtZIKwIJoHnS33qpXDeWrbpCo9EGWx74wM10KLJMf3qmNP+ee7k/Ujj8B+Z6DHJ8XjK1KTxSs76d7HxlTDQhL3Ryj+4m7/a7fn/hmsW71mTTp7zzYPNig2FtrD5A+cHJ7DFdGBtrFe2t7vVb+Bx/r4grsvBIAAHPtuOPrXpz5pfC9UaU4wXxLQNXiV9JunT7n2eRlb/gJrzD9nP8A5FvU/wDr8P8A6Ljr0aOTGh6lZMPntInT14KEgZ/P9K84/Zy/5FvUv+vw/wDouOtG21qRGCi3Y9c17/kXtS/69Jf/AEA18kaYf+JFdf8AXqv/AKFX1xrn/IA1L/r1l/8AQDXyNpp/4k1x/wBeq/8AoVVAJGNRS5/zzRn/ADzW5iJR8lLn/PNGaAEopc/55oz/AJ5oASilz/nmjP8AnmgB0P8Ar1/3q3Lk/wDE9/7eIP5rWLCf36f73vW1cH/ic/8AbxB/NaljR9h0UUVzHQFFFFABRRRQAUUUUAFFFFAHi3x0ZUuvDu/7n2xN30+bP6V0UV3af6ix8qBWY+Wq9H98Y4Pt1rmfjyfm0LP/AD9J/wCz1Y8LSNeatcJF92OPezdQpJIH4nn8qqrllHG0H7WN+XY3w+JVGTcnp+Bq6p4b0vWIN+o2itdqu1JVkZGxzgEgjI5PBzjNee+IdHi0qC3/ALPsZYk87dIzKx6dAWbOQTnjPau21fxjB4b1J7dLf7der/rGZtkcQIyAOCSxGM/Xr1FQW/iey8WfaE1O3W2VY8bd24MDnocA5zyPTGfp42Hvl1X2sqjdOLvyXbXbQ3x2WYqph3XoUrxl10vr1XU5LUruS5tIldIjsZX8vaCDtIJBz2459s1oWfgu/wDs6XH2Rfuh9vA3A8lRySD2rd0nw7BqU8tlaS22xo/3k3z7ih4OAR15HGcV6CulvsWLzVVdu33A9h6+/wD+quriSvWx3sp4BKUevl6nzmT08Vg5ThUcqdnttf18jgtOvrSOBIlRYlX7vl8Yx6Y6V6N4du3vtDguHO5juXd64YjP6VWn8KaJeT+fLp67/wCLYzKGx6gEA/jW1DDFbQJFCixxIoVVUYAA6AAdBXLl+X1cLUlKUrp9D6XGYyjiILki0+tzI8WteL4cvTZQySTCFiBG2DwCcDkc1wnhjVb1PDdvs2xXUTGJmXc4XDkdB8xyFzz689DXrBHHNcl4l0q1sbF7y0t4otp/f7WMa7T3YLyeccDrn2r1qMF7a8tnoebWqyVFqO61M7T5rr/iaNcSyqlzBMdrQ4BfBPBPIGCcLz9egrkv2c/+Ra1L/r7P/oEdXrqR4bG4uPs/zeTJtZbcRlcqf4pWyv1xVL9nT/kW9S/6/G/9AjrsxdNQlddTgy6vKrB826Z67rP/ACA7/wD69pf/AEE18g6cf+JNL/17L/6FX2Bq/wDyBr7/AK95P/QTXx/Yf8gd/wDr2X/0IVhTO6Zl/PRl6XFGK3MRM0ZpcUYoATNGXoxS4oAT56MvS4oxQA+H/Xr/AL1bFz/yGX/6+IP/AGWsmAfv0/3q1rgf8TZ/+viH/wBlqWNH2LRRRXMdAUUUUAFFFFABRRRQAUUUUAeK/HWNJZ/DqP8Ade+jRvodwNdxp+jWWjwNa6fbrBFu3N1Jc9NzE5LHAHJPauJ+OX/H94a/6/4f5tXpJv7P++3/AHzTeMpYZJVJJX7s48VTlOyR5b4s8E6zc65cXun263UVy29l8xFKHAyDuIyM9MVSt/D11oUnlajtSWVQ/wArZGB2z3Izz/k16+t9ZP8A8tf/AB009nsLmPZL5Uqfe2yLkfXBFeVi1hMTFqFVJvzR9DhOJMZSpxoVIpxiraaPQ5TwPA7TXV1t22+0RI3985ycfTA/Ou4SoY5bX+GWP0qYT2//AD1WujCzw2Goqmqidut0eXi68sVWdVq1+hMtSqarieL+/TxcRf361eMw/wDOvvM1Fk9Z2t3NrZ6HqFxfStFaxW7tLIvVVCnJHvjp71keIdEk1KyuG0rVZ9Pv2X93JuLR57blPQfTH49K8H1vWfHmiaPeeHPEqXF1ZXClFkusuM7gyskw5JBGQrE8cFQOAqeIhJ2TXydzbkXc2L3xLYW0Dy+bZtbsp/dxqrSuCOhZvm3HueMZ7Vv/ALOpP/CN6kf+ntv/AECKvMvC+lLr3iC3s5U3QpG9xcf7KIpJz7FsL9Wr0v8AZz/5FrUv+vxv/QIq3jOck+eV3+RnyU4/BFL0PYdV/wCQPe/9e7/+gmvjuxP/ABKX/wCvcf8AoQr7E1T/AJBN7/1wf/0E18bWh/4lX3v+Xcf+hVrSJmU8/wCxS5puaT/gdbmI7NGf9ik/4HSf8DoAfn/YpM03/gdL/wADoAdmjP8AsU2loAmhP7xP96tWU/8AE2f/AK+If5rWRF99K1HP/Eyf5/8Al4h/mtJjR9k0UUVynQFFFFABRRRQAUUUUAFFFFAHivx4/wCPjw7/ANf0X82raaeXzH+8vzbvz444x6/lWF8fv+Zf/wCvuP8A9mpxmuIXd33bNobdweh68d+np+vPzufU+f2fzJbsdFG7v/8AFcD/ADx/OpD5v8af8C59vTqK58XUqRxO77kaPcvy9sdPz/yMVJFqq+Y/zrsbHzbvXkdD6D9K+XeHmg5kb6XsUMab32pu27lYnnp17f8A1qkGp26f8tf93r7d/wAqwBqu+R9ny9fl3emCcfhj/PNOa/f+NIu+3/aHBBx3H+fpPsG9yuax0Kaok33Hb/eXPakm1DZA8v2vbtUs3y+gHXNYaTp5f7pPn+92PTvz7Z59/eo5JZZv72z/AGf4fUHr1Hbtjr6ipO++gc/c5DXPEXji51aeXTG1SOyaTbbLBaghlAADY2knPXnPX0rH1O7+JGvabLYXqXtxaNt3LNaxQjghlJIVT1A7130csvkO7orPz97gY7d/b9c1lyTXsP8AGq/w7uM8dcD8+pH9a+ioY1xilCmrrZkSqNkGkR2/hLQpbeG0X7bJbFZ7nvKSCSMnoATwB6DOa0v2df8AkXtS/wCvpv8A0CKsW91u9SC4+dZUaFt21s9iOemfwJxn89r9nT/kX9S/6+j/AOi469bK1UaqTqbtoIu57Fqn/IJvP+uD/wDoJr4xtm/4lS/9ch/6FX2fqP8AyDbr/ri//oJr4ttj/wAS1f8Arj/7NXsUwmQZozSZoFbmVgzS0lOFACf5/wA8UUuKdigQ0U4U/FKBQAsf30q9n/iZP/19Q/zWqkY/eJViM/8AEy/7eof/AEJaTGj7QooorlOgKKKKACiiigAooooAKKKKAPEP2gPuaH/F/pUf/s9Z0es2qQb0Tc65SNlYnkFWx6454PsRWj+0D/q9D/6+l9uz964kTxJI+xPlb7vbbk55GeD0/I15WaUlNRv5mcjq31hJo/N2fK0beXtwCpBHB9BjB/H1zVN5lf8A358t7LkA5GTjOAfxrAF8u99j/OuNvfgtjGO/XNEWofO/zt8qhl2/wjpnBH+7+teQsNbYzudIW2Wj7JWZv7qsfmwBn+Z/P3od2T7Pv3TpOu1mX+HHcAfhyeD7ZyOet9Qi/j+aJvu9iuGB/Hr37AjvVqadfP2/7IePc2dvqMjrnj/9dDo2eoXNWCa48x0+0Nv5bazYPGM5BI9T+vTk03+07h0/euyvx78nGDn14rGmv/3ibE+ZV2/ewOO/HTn+tQT3kr/Om3aqj93t+9x/9aj2Ce6EzYlunT79w0vXcu4454P1qlJffvHRItv+1Ixyv4j6D86yxNFNJ/d3LtbdyV6+vX86d9uXy9ife/utg8n2P4f/AFq1jQSEmS3j/wCiSvvb7rMu3ovynGOuO3HHfiu8/Z3G3QtU/wCvo/8AoEdeWXU7+RLEnyp5f949snjJ759K9Y/Z/TbpOq/9fX/tNK9vARtCXyNaZ65qH/INuv8Ari//AKCa+J4T/oMX/XP+tfbGof8AINuv+uL/APoJr4lgP+ixf9c/616FPcqYY/3qdilFOA/263IGhaULTwKcBQSNC04D/epwFOAoAYFp4WnAU8CkAxR+8p8Hz6l/29Q/+hLTsUyy/wCQsn/X3B/6GKGUj7TooorlNgooooAKKKKACiiigAooooA8O/aFH+iaR/12z+Svn+Yry+W/if5EdflU+nUYOQfz/Ovcfjdor6l4RivYl3tZSbj7A4BP6Y+pFfOD21KeFVdJt7GczcjkVJ9/mrs4/i+7inebv3/Ov3Qv3h2I6H2wawIbGW5kdIk3fkP5kehqKSB4XdHTa649D1GRyDjoaj+zl/N+BnY6hJovL3ptV+P4ge/oacZ9km7zV+b/AGh83PpWBpthFePL51x5FvBD500nllzjeqAKoI3Es68ZHc54q4LHSk+5qd43/cPX/wCP1k8ujfWX4D5Lmrc3EXz/ADr/AN9D+X+elVJL6J03o+3+Jl/u4I/Wn29npv8A0ELn/gViP6SmmvF5L7N6snDK3PQjI4PQ+o9c8nrTjl0f5vwDlKkl1F5n+tX/AGtrf57Gkim3/wAa/wDfX0/z+FaUUPnSbU2/N/tAfqeKHtv79a/UF3JaRmSzfu3b5W+UrtZvUV7n8CYtmk6x/wBfC/qg/wAK8hS3r3z4S6W1h4Ua4ddv2uYuv+6OAf51pGgqMXruawO4uY/NtZov78ZX8xiviG1/1EX/AFzP86+5K+LfE2mP4b8ZalpMqbUtLmRVX/pmx3IfoVZTV09yp7EAWlCc9d3vuA/UkAfiach3/wAf/j1SgVsYkAX94yMqLt/6aI38mNSBf881KB/u/wDAcD+VLtoXmN+QwLTgtPAp4WmIjCU8LTwKcBSAj21U0t1fXbVP+et/AP8Ax8VJqF4ltA6b/wB633V/u+9XPhro0uvfEDRrVVZkiuRdSt6JGQxJ9iQF/EUnsXFH2LRRRXMahRRRQAUUUUAFFFFABRRRQBBc20V5aS29wiywyqUdG6MDwRXhvif4M6lbzvPoTrd2rcrDIwWVPbJ4YfkfaveaSmpNbCaufJtx4G8TWjun9j6hH82N3llQ30PTvWdd+E9ah/1un3LP/s/O/wCS5NfYlFae2YuVHxqmg61D9zSdQXdwy/ZZAGGQ2CNvIyqnB7gelKdMv0+/o8//AIDyj+VfZFGKTq36Bynx4lrqX/QMnX/t3f8ArmrcGlak/wA/9n3zf9u7n+lfW2xf7q06j2r7BynytaaVqTyfurG5V/8AahZD/wCPAVoReG9fvJ9q6PqEjfd3fZ2I/wC+jwPzr6aoo9qxciPF/Dfwpv7idLjXkS0tV5a3Vg0r+xIyqj3BJ+nWvYoYo4YUiiVViRQqqvQAdAKmpKhyb3KSSFrzr4lfDC18cwJeW8q2eswLsjmZfklXqFfHOM9GHIyeD0r0WikM+PtU+G3jjQpmWXQbydS3+sso/PVvf5MkD6gVlnTNdi/4+NP1KD/f09/8K+1aK09oyeVHxOIbr+N51/7cWp6QzvIqLdy7mbaq/YXJY+gAHJr7VpMU/a+QcqPi0W100mxLiRnZtqr9hkzn0A29aPJuPu/a5d33dv2GT/CvtKil7RhynxcIL1/9VLct/u6e9S/2N4im/wBVp+sy/wDXPTXGfxxX2bRR7Rhyo+RNH+FHjPWpF8rRZ7RGPzTaj+5C+5B+b8lNfQnw8+Hdh4E06QJJ9p1K5A+03TLjgdEUdlH5k8nsB21LUuTY0rBRRRUjCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigD//2Q==</Picture>
</Mobile>
<Mobile ID='00283f5aa9c0c68c342c02977051757a7faae0ee70b086e628da7cc5baef2100' RegDate="26/05/2017">
<FullName>6600</FullName>
<Vendor>Nokia</Vendor>
<Date>2006</Date>
<Price>200SYP</Price>
<Weight>10g</Weight>
<Features>blutooth</Features>
<Notifecations></Notifecations>
<Picture>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</Picture>
</Mobile>
</Mobiles>
When I try to remove Mobile element depending on IDtextbox.text rather than static value in XPath expression it doesn't execute
I'm using Windows application in Visual Studio 2010, C# language
I need two examples:
1- Depending on an element inside the parent element.
2- depending on an attribute of the parent element, make sure that attribute is not an integer value, it's code.
Notice: I have searched for many websites and view multiple solutions nobody mention about using control value in XPath expressions.
Use xml linq which is better in this case than xpath
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
namespace ConsoleApplication1
{
class Program
{
const string FILENAME = #"c:\temp\test.xml";
static void Main(string[] args)
{
XDocument doc = XDocument.Load(FILENAME);
List<XElement> mobiles = doc.Descendants("Mobile").ToList();
mobiles = mobiles.Where(x => (string)x.Element("FullName") != "Galaxy S-4").ToList();
mobiles = mobiles.Where(x => (string)x.Attribute("RegDate") != "26/05/2017").ToList();
doc.Descendants("Mobiles").FirstOrDefault().ReplaceWith(new XElement("Mobiles", mobiles));
}
}
}
thanks, Mr.jdweng
I solve the problem with this code
XDocument doc = XDocument.Load(#"Mobiles.xml");
List<XElement> mobiles = doc.Descendants("Mobile").ToList();
//mobiles = mobiles.Where(x => (string)x.Element("ID") == ID).ToList();
mobiles = mobiles.Where(x => (string)x.Attribute("ID") == ID).ToList();
doc.Descendants("Mobile").FirstOrDefault().ReplaceWith();
Best regards
This is an extension of a question I had beforehand
I have a specific function that I want to run, and it is located inside an XML File:
Console.WriteLine("Text for test, {0}, {1}", testWord, testWord2);
The text is stored in an XML file:
<?xml version="1.0" encoding="utf-8" ?>
<root>
<world>
<region name="TestRegion">
<area name="TestArea">
<building name="Outside">
<room name="TutorialRoom">
<textToDisplay>"Text for test, {0},{1}"</textToDisplay>
<extraString>testWord,tesWord2</extraString>
</room>
</building>
</area>
</region>
</world>
</root>
I can easily get the string data using LINQ
XElement xelement = XElement.Load("..\\..\\LocationDatabase.xml");
var textToDisplay= xelement.Elements("world")
.Elements("region").Where(region => (string)region.Attribute("name") == "TestRegion")
.Elements("area").Where(area => (string)area.Attribute("name") == "TestArea")
.Elements("building").Where(building => (string)building.Attribute("name") == "Outside")
.Elements("room").Where(room => (string)room.Attribute("name") == "TutorialRoom")
.Elements("textToDisplay");
var extraString= xelement.Elements("world")
.Elements("region").Where(region => (string)region.Attribute("name") == "TestRegion")
.Elements("area").Where(area => (string)area.Attribute("name") == "TestArea")
.Elements("building").Where(building => (string)building.Attribute("name") == "Outside")
.Elements("room").Where(room => (string)room.Attribute("name") == "TutorialRoom")
.Elements("extraString");
And this works completely fine. The issue I have is when I don't have a word in the XML file, but rather a property of a class. I have a singleton Player, and it has a autoproperty Name. To normally access it, I can just say:
Console.WriteLine("Your name is:", Player.Instance.Name);
But how do I, instead, keep this in the XML file? Like:
<?xml version="1.0" encoding="utf-8" ?>
<root>
<world>
<region name="TestRegion">
<area name="TestArea">
<building name="Outside">
<room name="TutorialRoom">
<textToDisplay>"Your name is: {0}"</textToDisplay>
<extraString>Player.Instance.Name</extraString>
</room>
</building>
</area>
</region>
</world>
</root>
When I use the past command, it simple thinks that whole section is a string, and outputs "Your name is: Player.Instance.Name"
An example using my own code:
The Player Class:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace GuardsOfAetheria
{
class Player
{
public enum Class
{
Melee,
Magic,
Ranged
}
public string Name { get; set; }
public Class PlayerClass { get; set; }
private static readonly Player instance = new Player();
static Player()
{
}
private Player()
{
}
public static Player Instance
{
get
{
return instance;
}
}
}
}
Is there a way to solve this?
EDIT 1:
I was able to do something similar using the following lines of code:
var typ = typeof(Player);
var prop = typ.GetProperty("Name");
var propVal = prop.GetValue(Player.Instance);
Console.WriteLine(((string)textToDisplay.First()).Replace(#"\n", Environment.NewLine), propVal);
This works fine, and gets the necessary data. The issue here is that in different parts, different classes have to be called var typ = typeof(Player), and different instances have to be attributed var propVal = prop.GetValue(Player.Instance). I can store the name of the class and instance I need to get from, but simply using a string that holds that data doesn't work, like below:
string className = "Player";
var typ = typeof(className);
var prop = typ.GetProperty("Name");
var propVal = prop.GetValue(Player.Instance);
Console.WriteLine(((string)textToDisplay.First()).Replace(#"\n", Environment.NewLine), propVal);
Is there anyway to do that?
Type player = Type.GetType("Player");
or
Type player = Type.GetType("myNamespace.Player");
See here for more info
Then you are going to have to get an instance of that type, see manipulating types. Then you will need to get the PropertyInfo's for the type, then get the one you want Instance, etc for Instance object.
You will need to get into intimate detail of telling the compiler what object your working with and what properties you want to access. Reflection is a runtime compiled way of accessing objects. It is definitely more complicated than the run-of-the-mill program.
Im trying to monetize a free winform app, basically I want to have 10 images rotate every 5 min in a picture box. I dont want to hard code these into the app, but store the image url's on my server in a xml file.
this is the xml on my server
<?xml version="1.0" encoding="utf-8"?>
<Advertisements>
<Ad>
<ImageUrl1>http://example.com/example.jpg</ImageUrl1>
<url1>http://example.com</url1>
</Ad>
<Ad>
<ImageUrl2>http://example.com/example2.jpg</ImageUrl2>
<url2>http://example.com</url2>
</Ad>
</Advertisements>
Im stuck on how to rotate through each node and display the image for 5 min
Tried to find a decent example, but most are for ASP.net
This is the code in my app:
XmlTextReader reader = null;
try {
string xmlURL = "http://example.com/ads.xml";
reader = new XmlTextReader(xmlURL);
reader.MoveToContent();
string elementName = "";
if ((reader.NodeType == XmlNodeType.Element) &&
(reader.Name == "Advertisements")) {
while (reader.Read()) {
if (reader.NodeType == XmlNodeType.Element)
elementName = reader.Name;
else {
if ((reader.NodeType == XmlNodeType.Text) &&
(reader.HasValue)) {
switch (elementName)
{
case "ImageUrl1":
picturebox.ImageLocation=reader.Value);
break;
}
}
}
}
}
}
catch (Exception) {
}
finally {
if (reader != null) reader.Close();
}
Your current code uses the older XmlReader approach to parsing XML manually. This is usually complex and tricky to get right. If you are using .NET version 3.5 or higher, you can use LINQ to XML for a cleaner interface to working with XML.
The approach I would take to solving your problem is this:
On app start-up, load the list of Advertisements from the server and cache the result in a static variable
Shuffle the list once (after loading it), so you can just keep iterating over the list when picking a new Ad to show (no need to randomize)
Use a Timer instance to rotate the image every 5 minutes
Here is some sample C# code using LINQ to XML for loading your XML data:
using System.Collections.Generic;
using System.Linq;
using System.Xml.Linq;
namespace StackOverflowQ21588436
{
public class Example
{
private const string XML =
#"<?xml version=""1.0"" encoding=""utf-8""?>
<Advertisements>
<Ad>
<ImageUrl>http://example.com/example.jpg</ImageUrl>
<url>http://example.com</url>
</Ad>
<Ad>
<ImageUrl>http://example.com/example2.jpg</ImageUrl>
<url>http://example.com/2.html</url>
</Ad>
</Advertisements>";
public static IList<Advertisement> GetAdvertisements()
{
var xmlDocument = XDocument.Parse(XML); // or XDocument.Load(url)
var adXmlNodes = xmlDocument.Element("Advertisements").Elements("Ad");
var adList = adXmlNodes.Select(xmlNode => new Advertisement {
ImageUrl = xmlNode.Element("ImageUrl").Value,
Href = xmlNode.Element("url").Value
}).ToList();
return adList;
}
}
public class Advertisement
{
public string ImageUrl { get; set; }
public string Href { get; set; } // named 'Href' to show property names don't have to match XML
}
}
I'm trying to get my httphandler to print out an XML file with the format:
<ScheduledShows>
<ScheduledShowElement>...</ScheduledShowElement>
<ScheduledShowElement>...</ScheduledShowElement>
<ScheduledShowElement>...</ScheduledShowElement>
</ScheduledShows>
But for some reason, the attribute XmlRoot("ScheduledShowElement") in ScheduledShow.cs is not working the way i want it to work. Instead, the output i get is:
<ScheduledShows>
<ScheduledShow>...<ScheduledShow>
<ScheduledShow>...<ScheduledShow>
<ScheduledShow>...<ScheduledShow
</ScheduledShows>
Basically, the name of the node is not being overriden to . How do i get my xml serializer to label nodes as ?
Below is my code and xml output. Thanks!
OneDayScheduleHandler.cs
using System;
using System.Collections.Generic;
using System.Web;
using System.Xml.Serialization;
using Microsoft.Practices.EnterpriseLibrary.Data;
using System.Data.Common;
using System.Data;
using System.IO;
using System.Xml;
using System.Text;
using CommunityServer.Scheduler;
namespace CommunityServer.Scheduler
{
public class OneDayScheduleHandler : IHttpHandler
{
private readonly int NoLimitOnSize = -1;
public void ProcessRequest(HttpContext context)
{
int offsetInDays, timezone, size;
DateTime selectedDateTime;
Int32.TryParse(context.Request.QueryString["timezone"], out timezone);
Int32.TryParse(context.Request.QueryString["daysToOffset"], out offsetInDays);
if (!String.IsNullOrEmpty(context.Request.QueryString["size"]))
{
Int32.TryParse(context.Request.QueryString["size"], out size);
}
else
{
size = NoLimitOnSize;
}
if (timezone < (int)ScheduleConstants.TimeZone.Eastern)
{
selectedDateTime = DateTime.Now.AddMinutes(-180);
}
else
{
selectedDateTime = DateTime.Now;
}
selectedDateTime = selectedDateTime.AddDays(offsetInDays);
context.Response.ContentType = "text/xml";
context.Response.Write(SerializeToXML((List<ScheduledShow>)GetSheduledShowsByDateTime(selectedDateTime, size)));
}
public bool IsReusable
{
get
{
return false;
}
}
public static IList<ScheduledShow> GetSheduledShowsByDateTime(DateTime date, int size)
{
List<ScheduledShow> shows = new List<ScheduledShow>();
Database db = DatabaseFactory.CreateDatabase("TVScheduleSqlServer");
DbCommand cmd = db.GetStoredProcCommand("sp_get_YTVDayShowlist");
db.AddInParameter(cmd, "#CurrentDay", DbType.DateTime, date);
IDataReader reader = db.ExecuteReader(cmd);
int i = 0;
while (reader.Read() && (i < size || size == -1))
{
ScheduledShow show = new ScheduledShow();
show.AirTime = Convert.ToDateTime(reader["Airing_datetime"].ToString());
show.StationId = Convert.ToInt32(reader["Station_id"].ToString());
show.ScheduleRowId = Convert.ToInt32(reader["id"].ToString());
show.StoryLine = reader["StoryLine"].ToString();
show.Title = reader["Title_name"].ToString();
show.SimsTitleId = Convert.ToInt32(reader["Sims_title_id"].ToString());
show.ProgramId = Convert.ToInt32(reader["Program_id"].ToString());
show.Genre = reader["Genre_list"].ToString();
show.ProgramName = reader["program_name"].ToString();
show.ShowUrl = reader["ShowURL"].ToString();
show.CssClass = reader["CSSCLASS"].ToString();
shows.Add(show);
i++;
}
reader.Close();
reader.Dispose();
return shows;
}
static public string SerializeToXML(List<ScheduledShow> shows)
{
XmlSerializer serializer = new XmlSerializer(typeof(List<ScheduledShow>), new XmlRootAttribute("ScheduledShows"));
//StringWriter stringWriter = new StringWriter();
string xml;
using (MemoryStream memoryStream = new MemoryStream())
{
using (XmlTextWriter xmlTextWriter = new XmlTextWriter(memoryStream, Encoding.UTF8))
{
serializer.Serialize(xmlTextWriter, shows);
using (MemoryStream memoryStream2 = (MemoryStream)xmlTextWriter.BaseStream)
{
xml = UTF8ByteArrayToString(memoryStream2.ToArray());
}
}
}
return xml;
}
/// <summary>
/// To convert a Byte Array of Unicode values (UTF-8 encoded) to a complete String.
/// </summary>
/// <param name="characters">Unicode Byte Array to be converted to String</param>
/// <returns>String converted from Unicode Byte Array</returns>
private static String UTF8ByteArrayToString(Byte[] characters)
{
UTF8Encoding encoding = new UTF8Encoding();
String constructedString = encoding.GetString(characters);
return (constructedString);
}
}
}
ScheduledShow.cs
using System;
using System.Xml.Serialization;
namespace CommunityServer.Scheduler
{
[XmlRoot("ScheduledShowElement")]
public class ScheduledShow
{
[XmlElement("AirTime")]
public DateTime AirTime
{ get; set; }
[XmlElement("StationId")]
public int StationId
{ get; set; }
[XmlElement("ScheduleRowId")]
public int ScheduleRowId
{ get; set; }
[XmlElement("StoryLine")]
public string StoryLine
{ get; set; }
[XmlElement("Title")]
public string Title
{ get; set; }
[XmlElement("ProgramId")]
public int ProgramId
{ get; set; }
[XmlElement("Genre")]
public string Genre
{ get; set; }
[XmlElement("ProgramName")]
public string ProgramName
{ get; set; }
[XmlElement("SimsTitleId")]
public int SimsTitleId
{ get; set; }
[XmlElement("ShowUrl")]
public string ShowUrl
{ get; set; }
[XmlElement("CssClass")]
public string CssClass
{ get; set; }
}
}
Output of the xml file
<?xml version="1.0" encoding="utf-8"?>
<ScheduledShows xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<ScheduledShow>
<AirTime xmlns="http://example.books.com">2009-09-17T10:20:00</AirTime>
<StationId xmlns="http://example.books.com">770</StationId>
<ScheduleRowId xmlns="http://example.books.com">17666100</ScheduleRowId>
<StoryLine xmlns="http://example.books.com">When Dooley demonstrates his newest hobby, magic, Willa gets an idea. A huge backyard magic show! Starring the Great Doolini and his amazing disappearing elephant trick! Unfortunately, Lou the elephant misunderstands and thinks Willa wants him to disappear for real. In the middle of the show Willa must find Lou and apologize so he’ll reappear! / When the animals and Willa discover an egg in their backyard, their parental propriety kicks in. Especially when Dooley relates a factoid about young hatchlings imprinting on the first critter they see. Willa’s critters vie for egg watching rights, so they can be first to be called Mama! Or Poppa!</StoryLine>
<Title xmlns="http://example.books.com">Disappearing Act / Great Eggspectations</Title>
<ProgramId xmlns="http://example.books.com">2202</ProgramId>
<Genre xmlns="http://example.books.com">Animated</Genre>
<ProgramName xmlns="http://example.books.com">Willa's Wild Life</ProgramName>
<SimsTitleId xmlns="http://example.books.com">68914</SimsTitleId>
<ShowUrl xmlns="http://example.books.com">willas_wildlife</ShowUrl>
<CssClass xmlns="http://example.books.com">none</CssClass>
</ScheduledShow>
<ScheduledShow>
<AirTime xmlns="http://example.books.com">2009-09-17T10:45:00</AirTime>
<StationId xmlns="http://example.books.com">770</StationId>
<ScheduleRowId xmlns="http://example.books.com">17666105</ScheduleRowId>
<StoryLine xmlns="http://example.books.com">It’s Club Day in Gloomsville. The gang splinter off to form clubs and prepare for the club’s appearance in the big Gloomsville parade. Skull Boy forms the coolest club of all with some new jazzy skeletal friends that no one ever sees. At first no one believes Skull Boy has these new friends since every time they want to meet them, they disappear. When pressed for details, she admits she hasn’t met them yet – they’re imaginary. </StoryLine>
<Title xmlns="http://example.books.com">Skull Boys Don't Cry</Title>
<ProgramId xmlns="http://example.books.com">1418</ProgramId>
<Genre xmlns="http://example.books.com">Animated</Genre>
<ProgramName xmlns="http://example.books.com">Ruby Gloom</ProgramName>
<SimsTitleId xmlns="http://example.books.com">54297</SimsTitleId>
<ShowUrl xmlns="http://example.books.com">rubygloom</ShowUrl>
<CssClass xmlns="http://example.books.com">none</CssClass>
</ScheduledShow>
<ScheduledShow>
<AirTime xmlns="http://example.books.com">2009-09-17T11:10:00</AirTime>
<StationId xmlns="http://example.books.com">770</StationId>
<ScheduleRowId xmlns="http://example.books.com">17666113</ScheduleRowId>
<StoryLine xmlns="http://example.books.com">When Mad Margaret gets trapped in a jar she becomes a source of entertainment for Erky./Erky and Perky need a place to live and who better to find it for them than Frenzel.</StoryLine>
<Title xmlns="http://example.books.com">Erky's Birthday / Location Location Location</Title>
<ProgramId xmlns="http://example.books.com">1347</ProgramId>
<Genre xmlns="http://example.books.com">Animated</Genre>
<ProgramName xmlns="http://example.books.com">Erky Perky</ProgramName>
<SimsTitleId xmlns="http://example.books.com">49009</SimsTitleId>
<ShowUrl xmlns="http://example.books.com">erky_perky</ShowUrl>
<CssClass xmlns="http://example.books.com">none</CssClass>
</ScheduledShow>
<ScheduledShow>
<AirTime xmlns="http://example.books.com">2009-09-17T11:35:00</AirTime>
<StationId xmlns="http://example.books.com">770</StationId>
<ScheduleRowId xmlns="http://example.books.com">17666116</ScheduleRowId>
<StoryLine xmlns="http://example.books.com">SYNOPSIS:The Joyco toy company has heard about George and his Zoopercar and they want to market it as their newest toy. But George isn't interested in selling his prized mode of transportation. Afterall, he and his Dad built it together and no one can take that special bond away from him. But two Joyco toy employees, Barry and Steve, have other plans. If George won't sell it to them, they will just have to take it, which they do. But once their boss, Big Ed Easy finds out that George has be</StoryLine>
<Title xmlns="http://example.books.com">ZOOPERCAR CAPER</Title>
<ProgramId xmlns="http://example.books.com">311</ProgramId>
<Genre xmlns="http://example.books.com" />
<ProgramName xmlns="http://example.books.com">George Shrinks</ProgramName>
<SimsTitleId xmlns="http://example.books.com">25371</SimsTitleId>
<ShowUrl xmlns="http://example.books.com" />
<CssClass xmlns="http://example.books.com">none</CssClass>
</ScheduledShow>
<ScheduledShow>
<AirTime xmlns="http://example.books.com">2009-09-17T11:35:00</AirTime>
<StationId xmlns="http://example.books.com">770</StationId>
<ScheduleRowId xmlns="http://example.books.com">17666116</ScheduleRowId>
<StoryLine xmlns="http://example.books.com">SYNOPSIS:The Joyco toy company has heard about George and his Zoopercar and they want to market it as their newest toy. But George isn't interested in selling his prized mode of transportation. Afterall, he and his Dad built it together and no one can take that special bond away from him. But two Joyco toy employees, Barry and Steve, have other plans. If George won't sell it to them, they will just have to take it, which they do. But once their boss, Big Ed Easy finds out that George has be</StoryLine>
<Title xmlns="http://example.books.com">ZOOPERCAR CAPER</Title>
<ProgramId xmlns="http://example.books.com">311</ProgramId>
<Genre xmlns="http://example.books.com" />
<ProgramName xmlns="http://example.books.com">George Shrinks</ProgramName>
<SimsTitleId xmlns="http://example.books.com">25371</SimsTitleId>
<ShowUrl xmlns="http://example.books.com">george_shrinks</ShowUrl>
<CssClass xmlns="http://example.books.com">none</CssClass>
</ScheduledShow>
</ScheduledShows>
I found an answer to my question here:
http://social.msdn.microsoft.com/Forums/en-US/asmxandxml/thread/4b228734-a209-445a-991c-0420b381ac93
I just used [XmlType("")] and that worked.
using System;
using System.Xml.Serialization;
namespace CommunityServer.Scheduler
{
[XmlType("ScheduledShowElement")]
public class ScheduledShow
{
...
}
}
[XmlRoot(...)] only affects the outermost element (<ScheduledShows>...</ScheduledShows>). I suspect you want [XmlElement(...)]. Of course, another way is to write an object wrapper:
[XmlRoot("SheduledShows")]
public class Shows {
[XmlElement("SheduledShowElement")]
public List<Show> Shows {get;set;}
}
And serialize this wrapper object instead of just a list.
You need to use the overloaded constructor that takes in a XmlAttributeOverrides and make sure you override the name of the ScheduledShow class.
I also used XmlType attribute [XmlType("")] and worked.
[XmlRoot] and [XmlType] are only available for classes.
[XmlElement] are only for properties.
See this: https://learn.microsoft.com/en-us/dotnet/standard/serialization/controlling-xml-serialization-using-attributes#controlling-serialization-of-classes-using-xmlrootattribute-and-xmltypeattribute