简体   繁体   中英

Traversing complex XML document in C# with XLinq

So I want to access the child element in a structure that looks like this:

<asdf:foobar attr="value">
    <child>...</child>
</asdf:foobar>

I forget what the asdf is called, but it is what's causing the problem. My normal method of traversing in XLinq doesn't work:

xElem child = xDoc.Element("foobar");

Sets child to null because it claims there is no element foobar , and

xElem child = xDoc.Element("asdf:foobar");

Doesn't work because the compiler whines about the semicolon.

All help is appreciated, and thanks in advance!

I've been working on a reproduction of this as an example (since I can't show you the actual code). My test code:

        Console.WriteLine("BEGIN TEST");

        const string MY_SCHEMA = "http://www.example.com/whatever";

        XElement xTest =
        new XElement("{" + MY_SCHEMA + "}base",
            new XAttribute("{" + XML_STANDARD + "}boofar", MY_SCHEMA),
            new XAttribute("attr1", "val"),
            new XElement("{" + MY_SCHEMA + "}asdf", "ghjkl")
        );

        result.Text = xTest.ToString();

        XElement xOps2 = xTest.Element(XName.Get("asdf", MY_SCHEMA));
        XElement xSubOps2;

        if (xOps2 == null)
        {
            MessageBox.Show("Failure.");
        }
        else
        {
            xSubOps2 = xOps2.Element(XName.Get("asdf", MY_SCHEMA));
            MessageBox.Show(xSubOps2.ToString());
        }

        Console.WriteLine("END TEST");

        MessageBox.Show("END TEST");

This displays the XML that I want:

<boofar:base xmlns:boofar="http://www.example.com/whatever" attr1="val">
  <boofar:asdf>ghjkl</boofar:asdf>
</boofar:base>

And everything is working great. Thanks all!

Unfortunately the implicit conversion from string to XName does not parse out the namespace. You need to do this:

XName.Get("foobar", "asdf");

Another way you can handle namespaces is by using the XNamespace class.

  XNamespace ns = "http://www.example.com/whatever";
  XElement child = new XElement(ns + "base");

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM