gpt4 book ai didi

c# - 如何从 XmlReader 获取范围内的命名空间

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

我需要为元素实现可序列化类型,该元素包含具有类似 XPath 表达式的任何元素的序列。它有非常简单的方案:

<xsd:complexType name="FilterType">
<xsd:sequence>
<xsd:any minOccurs="0" maxOccurs="unbounded" />
</xsd:sequence>
</xsd:complexType>

这个元素的语义在WSBaseNotification中描述。主题 4.2。问题是要解释表达式,我们需要一些机制来解析其中使用的前缀(XmlReader 通过 LookupNamespace 提供此类功能)。但是还有一个问题就是现阶段还无法解析表达式,此时我们甚至不能对表达式类型和方言做任何假设。所以我们需要以某种方式收集该范围内所有定义的前缀。一些 XmlReader-s(例如 XmlTextReader)实现了接口(interface) IXmlNamespaceResolver,它通过 GetNamespacesInScope 提供了这样的功能,但其中许多没有(例如XmlMtomReader)。这种类型在很多 web 服务请求中使用,web 服务使用 wcf 框架并有多个绑定(bind),所以我们不能对将使用什么 XmlReader 做任何假设。这是这种类型的原型(prototype)实现,如果我们有 XmlReaderGetNamespacesInScope:

[Serializable]
public class FilterType : IXmlSerializable {
public XElement[] Any;
public void ReadXml(XmlReader reader) {
var xelist = new LinkedList<XElement>();
reader.Read();
var dr = reader as XmlDictionaryReader;
var gns = reader.GetNamespacesInScope(); // need to implement

while (reader.NodeType != XmlNodeType.EndElement) {
if (reader.NodeType == XmlNodeType.Element) {
var x = XElement.ReadFrom(reader) as XElement;
foreach (var ns in gns) {
var pref = ns.Key;
var uri = ns.Value;
if (x.GetNamespaceOfPrefix(pref) == null) {
x.Add(new XAttribute(XName.Get(pref, "http://www.w3.org/2000/xmlns/"), uri));
}
}
xelist.AddLast((XElement)x);
} else {
reader.Skip();
}
}
Any = xelist.ToArray();
reader.ReadEndElement();
}

public void WriteXml(XmlWriter writer) {
if (Any != null) {
foreach (var x in Any) {
x.WriteTo(writer);
}
}
}

public XmlSchema GetSchema() {
return null;
}
}

有没有办法为每个可能的 XmlReader 实现 GetNamespacesInScope?或者也许还有其他解决方案?

最佳答案

我使用这样的代码:

        XPathDocument doc = new XPathDocument("catalog.xml");
XPathNavigator nav = doc.CreateNavigator();
var v = nav.GetNamespacesInScope(XmlNamespaceScope.All);

希望对你有帮助拉杜

关于c# - 如何从 XmlReader 获取范围内的命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8466608/

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