我需要为元素实现可序列化类型,该元素包含具有类似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 )实现了接口IXmlNamespaceResolver ,它通过GetNamespacesInScope提供了这样的功能,但很多都没有(例如XmlMtomReader )。 这种类型在许多Web服务请求中使用,Web服务使用wcf框架并具有多个绑定,因此我们不能对将使用什么XmlReader做出任何假设。 这是这种类型的原型实现,如果我们有XmlReader GetNamespacesInScope

[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 或者也许有另一种解决方案?

===============>>#1 票数:3

我使用这样的代码:

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

希望它有所帮助,Radu

===============>>#2 票数:1

但是,您可能需要命名空间管理器 - 例如:

XmlElement el = ...; //TODO
XmlNamespaceManager nsmgr = new XmlNamespaceManager(
    el.OwnerDocument.NameTable);
nsmgr.AddNamespace("x", el.OwnerDocument.DocumentElement.NamespaceURI);
var nodes = el.SelectNodes(@"/x:outerelement/x:innerelement", nsmgr);

  ask by andrey.ko translate from so

未解决问题?本站智能推荐:

1回复

除非与类的命名空间不同,否则命名空间不会在WCF中附加到bool

我在WCF中使用了一种数据类型来发送SOAP响应。 看起来像这样: 问题是名称空间( http://foobar )没有出现在元素中。 也就是说,除非我将XmlElementAttibute的命名空间更改为与父类的XmlRootAttribute的命名空间不同的名称。 这是开始呼叫
1回复

XML有效载荷POST到WCF REST服务中的命名空间问题

我收到带有以下代码的400错误的请求错误: 这是我的WCF服务合同 以下xml有效负载将起作用,并返回200 但是,此XML下面带有非默认名称空间将导致400错误 我应该如何处理此命名空间问题?
1回复

具有“ http://www.w3.org/2001/XMLSchema”名称空间的性能影响

我的组织中所有基于WCF SOAP的Web服务都具有名称空间xmlns:xs =“ http://www.w3.org/2001/XMLSchema”的定义,是否会对性能造成任何影响,如下所示: 我问这个问题是由于以下事实: 它托管在远程主机上。 有时,MS-SCOM表
7回复

如何获取WCF Web服务请求的XML SOAP请求?

我在代码中调用此Web服务,我希望看到XML,但我找不到暴露它的属性。
1回复

使用DataContractSerializer在WCF中反序列化XML

我正在将XML文档发布到WCF REST服务。 我能够使用DataContractSerializer解析元素,但无法提取属性。 我已经尝试了其他SO问题中的几种方法,但要么无法获取要解析的属性,要么无法获取正确的对象。 例如,目前我的代码仅解析一个FieldData,而Fields Li
1回复

在C#WCF中通过REST XML发布对象返回400错误请求

我正在尝试使用带有XML的REST将对象发布到WCF服务,但是我不断收到"error: (400) Bad Request" 。 我知道这个站点上有很多关于相同问题的文章,但是我似乎找不到解决方法。 我的WCF服务代码: iPhoneBookService.cs: Phon
1回复

加密和解密后XML中的非法十六进制字符

由于某些原因,我必须使用两种方式手动加密WCF消息,并且无法使用WCF的默认内置安全机制。 没有加密,一切工作正常,但是加密后,我在WCF XML消息中看到一些非法字符。 如果我使用正则表达式删除了这些非法字符,即使使用加密,一切也可以正常工作。 题: 我的加密有什么问题
1回复

使用字典中的属性格式化的WCF XML

因此,我有一个使用肥皂请求返回数据的wcf服务。 此数据以xml格式返回。 我想要做的是将属性添加到某个类的返回的xml中。 例如 将作为返回 我一直在环顾四周,但找不到可靠的答案。
2回复

WCF:DataMember属性中的[XmlElement,typeof]

我想做这样的事情: 我想使用WCF的DataContractSerializer做到这一点。 Datamember属性中的内容类似。 这等效于xsd:Choice 。 我旨在根据标签的类型动态分配标签。 谢谢。
1回复

使用XML声明在WCF中反序列化xml元素

我有一个具有以下签名的WCF服务: 当我收到不带xml声明的请求时,web服务可以正常运行,但是一旦添加xml声明,我就会崩溃。 有效的要求 无效的要求 和崩溃: 我假设发生的事情是WCF服务将整个soap信封作为一个xml文档读取,然后当它遇到xml声明(