首页 > 解决方案 > xmlns 属性导致 C# 中的 XDocument 出错

问题描述

不知何故xmlns in<math xmlns='bla'>导致错误。通过更改xmlns为例如xmlnss错误将不会发生。不是什么原因,有解决办法吗?

using System;
using System.Collections.Generic;
using System.Xml.Linq;
using System.Linq;                      
public class Program{
        public static void Main(){
            string mathMLResult = @"<math xmlns='bla'>
                            <SnippetCode>
                              testcode1
                            </SnippetCode>
                        </math>";

            XDocument xml = XDocument.Parse(mathMLResult);
            XElement mathNode = xml.Descendants("math").FirstOrDefault();

            // error occurres in this line
            List<XNode> childNodes = mathNode.Nodes().ToList();

            XElement mrow = new XElement("mrow");
            mrow.Add(childNodes);
            mathNode.RemoveNodes();
            XElement mstyle = new XElement("mstyle");
            XElement semantics = new XElement("semantics");
            XElement annotation = new XElement("annotation",
            new XAttribute("encoding", "\&quot;application/x-tex\&quot;"));
            semantics.Add(mrow);
            semantics.Add(annotation);
            mstyle.Add(semantics);
            mathNode.Add(mstyle);
            var s = mathNode.ToString();

            Console.WriteLine(s);
        }
    }

这就是我真正想要的。

  <math xmlns="bla">
  <mstyle>
    <semantics>
      <mrow>
        <SnippetCode>
              testcode1
         </SnippetCode>
      </mrow>
      <annotation encoding="&quot;application/x-tex&quot;" />
    </semantics>
  </mstyle>
</math>

标签: c#xmllinq-to-xml

解决方案


xlmns 用于命名空间,但在您的情况下,它只是无处可寻。它用于查找应如何读取 XML。它可以是任何东西

xmlns:xsl -

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

xmlns:安卓

xmlns:xhtml

在这里检查

https://www.w3.org/TR/REC-xml-names/

https://www.w3schools.com/xml/xml_namespaces.asp

如果您仍然想这样做,请尝试下面的代码,但 xml 应该是正确的格式

XDocument xDoc = XDocument.Parse(xml);
XNamespace bla = "bla";

我尝试了以下代码,它可以正常工作而不会出错

string mathMLResult = @"<math xmlns='bla'>
                            <SnippetCode>
                              testcode1
                            </SnippetCode>
                        </math>";

XDocument xmld = XDocument.Parse(mathMLResult);
XNamespace bla = "bla";
var mathItem = xmld.Element(bla + "math");
var SnippetCodeItem = mathItem.Element(bla + "SnippetCode");

在此处输入图像描述

试试下面的代码。它可能有效

static XElement stripNS(XElement root)
{
    return new XElement(
        root.Name.LocalName,
        root.HasElements ?
            root.Elements().Select(el => stripNS(el)) :
            (object)root.Value
    );
}

static void Main(string[] args)
{

    string mathMLResult = @"<math xmlns='bla'>
                    <SnippetCode>
                        testcode1
                    </SnippetCode>
                </math>";

    XDocument xmld = XDocument.Parse(mathMLResult);
    XNamespace bla = "bla";
    var mathNode = xmld.Element(bla + "math");
    mathNode = stripNS(mathNode);
    List<XNode> childNodes = mathNode.Nodes().ToList();

    XElement mrow = new XElement("mrow");
    mrow.Add(childNodes);
    mathNode.RemoveNodes();

    XElement mstyle = new XElement("mstyle");
    XElement semantics = new XElement("semantics");
    XElement annotation = new XElement("annotation",
    new XAttribute("encoding", "&quot;application/x-tex&quot;"));
    semantics.Add(mrow);
    semantics.Add(annotation);
    mstyle.Add(semantics);
    mathNode.Add(mstyle);

    var s = mathNode.ToString();
    Console.WriteLine(s);
}

推荐阅读