c# - query - xelement search for element
Espacios de nombres de XElement(¿Cómo?) (2)
Cómo crear un documento xml con prefijo de nodo como:
<sphinx:docset>
<sphinx:schema>
<sphinx:field name="subject"/>
<sphinx:field name="content"/>
<sphinx:attr name="published" type="timestamp"/>
</sphinx:schema>
Cuando trato de ejecutar algo así como new XElement("sphinx:docset")
excepción
Excepción no controlada: System.Xml.XmlException: el carácter '':'', valor hexadecimal 0x3A, no se puede incluir en un nombre.
en System.Xml.XmlConvert.VerifyNCName (String name, ExceptionType exceptionTyp e)
en System.Xml.Linq.XName..ctor (XNamespace ns, String localName)
en System.Xml.Linq.XNamespace.GetName (String localName)
en System.Xml.Linq.XName.Get (String expandedName)
Es realmente fácil en LINQ a XML:
XNamespace ns = "sphinx";
XElement element = new XElement(ns + "docset");
O para que el "alias" funcione correctamente para que se vea como sus ejemplos, algo como esto:
XNamespace ns = "http://url/for/sphinx";
XElement element = new XElement("container",
new XAttribute(XNamespace.Xmlns + "sphinx", ns),
new XElement(ns + "docset",
new XElement(ns + "schema"),
new XElement(ns + "field", new XAttribute("name", "subject")),
new XElement(ns + "field", new XAttribute("name", "content")),
new XElement(ns + "attr",
new XAttribute("name", "published"),
new XAttribute("type", "timestamp"))));
Eso produce:
<container xmlns:sphinx="http://url/for/sphinx">
<sphinx:docset>
<sphinx:schema />
<sphinx:field name="subject" />
<sphinx:field name="content" />
<sphinx:attr name="published" type="timestamp" />
</sphinx:docset>
</container>
Puede leer el espacio de nombre de su documento y usarlo en consultas como esta:
XDocument xml = XDocument.Load(address);
XNamespace ns = xml.Root.Name.Namespace;
foreach (XElement el in xml.Descendants(ns + "whateverYourElementNameIs"))
//do stuff