gpt4 book ai didi

c# - 我可以在加载 XDocument 时使用预定义的命名空间吗?

转载 作者:数据小太阳 更新时间:2023-10-29 01:55:49 25 4
gpt4 key购买 nike

我经常需要处理包含命名空间元素但未声明命名空间的 XML 文档。例如:

<root>
<a:element/>
</root>

因为从未为前缀“a”分配 namespace URI,所以该文档无效。当我使用以下代码加载这样的 XML 文档时:

using (StreamReader reader = new StreamReader(new FileStream(inputFileName,    
FileMode.Open, FileAccess.Read, FileShare.ReadWrite))) {
doc = XDocument.Load(reader, LoadOptions.PreserveWhitespace);
}

它抛出一个异常(正确地)说明文档包含未声明的命名空间并且格式不正确。

那么,我可以预定义默认命名空间前缀 -> 命名空间 URI 对,以便解析器返回吗? XMLNamespaceManager 看起来很有前途,但不知道如何将其应用于这种情况(或者如果我可以的话)。

最佳答案

您可以创建一个 XmlReader 和一个知道命名空间的 XmlParserContext;以下适用于 XmlDocumentXDocument:

class SimpleNameTable : XmlNameTable {
List<string> cache = new List<string>();
public override string Add(string array) {
string found = cache.Find(s => s == array);
if (found != null) return found;
cache.Add(array);
return array;
}
public override string Add(char[] array, int offset, int length) {
return Add(new string(array, offset, length));
}
public override string Get(string array) {
return cache.Find(s => s == array);
}
public override string Get(char[] array, int offset, int length) {
return Get(new string(array, offset, length));
}
}
static void Main() {
XmlNamespaceManager mgr = new XmlNamespaceManager(new SimpleNameTable());
mgr.AddNamespace("a", "http://foo/bar");
XmlParserContext ctx = new XmlParserContext(null, mgr, null,
XmlSpace.Default);
using (XmlReader reader = XmlReader.Create(
new StringReader(@"<root><a:element/></root>"), null, ctx)) {

XDocument doc = XDocument.Load(reader);

//XmlDocument doc = new XmlDocument();
//doc.Load(reader);
}
}

关于c# - 我可以在加载 XDocument 时使用预定义的命名空间吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/879728/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com