c# - 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", "\"application/x-tex\""));
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=""application/x-tex"" />
</semantics>
</mstyle>
</math>
解决方案
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", ""application/x-tex""));
semantics.Add(mrow);
semantics.Add(annotation);
mstyle.Add(semantics);
mathNode.Add(mstyle);
var s = mathNode.ToString();
Console.WriteLine(s);
}
推荐阅读
- gremlin - 它不会添加具有正确进出顶点的边
- c# - 比较两个字符串列表时的 cosmosDb SQL API LINQ 优化
- go - 在 cli 中使用进度条
- cognos - 如何使用 Cognos Analytics 为不同的列定义不同的聚合函数(例如:平均值、总和)?
- f# - 为什么 R 类型提供程序在没有类似安装时会抛出异常?
- node.js - Google Cloud Function 无法连接到 Redis
- elasticsearch - 使用 copy_to 突出显示弹性搜索
- apache-zeppelin - Apache Zeppelin,已删除的笔记本
- angular - Angular 5 HTTPClient 基本授权不起作用
- css - 如何使用 bootstrap 4 获得折叠菜单后面的徽章?