使用XLinq在C#中遍历复杂的XML文档

时间:2010-06-28 23:53:55

标签: c# xml linq linq-to-xml

所以我想在一个看起来像这样的结构中访问子元素:

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

我忘记了调用asdf的内容,但这是造成问题的原因。我在XLinq中遍历的常规方法不起作用:

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

child设置为null,因为它声称没有元素foobar,并且

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

不起作用,因为编译器抱怨分号。

感谢所有帮助,并提前感谢!

UPDATE:

我一直在努力将此作为一个例子(因为我无法向您展示实际代码)。我的测试代码:

        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");

这会显示我想要的XML:

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

一切都很好。谢谢大家!

2 个答案:

答案 0 :(得分:2)

不幸的是,从stringXName的隐式转换并未解析出命名空间。你需要这样做:

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

答案 1 :(得分:1)

另一种处理命名空间的方法是使用XNamespace类。

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