使用命名空间创建XElement?

时间:2015-06-19 09:25:06

标签: c# xml xml-namespaces

我正在尝试使用以下XML(对于第三方;因此需要确切)并且在内部元素上使用xmlns时遇到一些问题:

<headerResponse xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <sessionID xmlns="http://www.example.com/portal-api">4654654564</sessionID>
  <uniqueTranID xmlns="http://www.example.com/portal-api">gh0000000</uniqueTranID>
  <statusCode xmlns="http://www.example.com/portal-api">1</statusCode>
  <statusCodeDescription xmlns="http://www.example.com/portal-api">jhkjhkjhkjhkjkjhkjkkjhkhk</statusCodeDescription>
  <message xmlns="http://www.example.com/portal-api">testMessage</message>
</headerResponse>

从其他例子来看,我有以下几点:

XNamespace xsi = "http://www.w3.org/2001/XMLSchema-instance";
XNamespace xsd = "http://www.w3.org/2001/XMLSchema";
XNamespace api = "http://www.example.com/portal-api";

XElement example = new XElement("headerResponse",
  new XAttribute(XNamespace.Xmlns + "xsi", xsi),
  new XAttribute(XNamespace.Xmlns + "xsd", xsd),
  new XElement("sessionID", "some session id", new XAttribute("xmlns", api))
);

没有sessionID,它很高兴用xsi和xsd创建了主headerResponse,但是当我添加sessionID并尝试使用example.toString()在即时窗口中发布内容时,我收到以下错误:< / p>

The prefix '' cannot be redefined from '' to 'http://www.example.com/portal-api' within the same start element tag.

1 个答案:

答案 0 :(得分:3)

您需要使用其完全限定名称(即包括其名称空间)定义元素名称XNamespace xsi = "http://www.w3.org/2001/XMLSchema-instance"; XNamespace xsd = "http://www.w3.org/2001/XMLSchema"; XNamespace api = "http://www.example.com/portal-api"; XElement example = new XElement("headerResponse", new XAttribute(XNamespace.Xmlns + "xsi", xsi), new XAttribute(XNamespace.Xmlns + "xsd", xsd), new XElement(api + "sessionID", "some session id") ); 。 LINQ to XML将自动处理默认名称空间声明的插入:

api

您可以通过添加它们来控制声明,就像您已经完成的那样。例如,您可以为XElement example = new XElement("headerResponse", new XAttribute(XNamespace.Xmlns + "xsi", xsi), new XAttribute(XNamespace.Xmlns + "xsd", xsd), new XAttribute(XNamespace.Xmlns + "api", api), new XElement(api + "sessionID", "some session id") ); 添加一个带有前缀的声明,以简化结果:

foreach($array as $k => $v ) {
    if ($v['field_id'] ==104) {
        $value = $v['meta_value'];
    }
}

请注意,尽管XML看起来与您所需的XML不同,但它们之间在语义上没有区别。