Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Xml序列化/反序列化索引项_C#_Xml_Asp.net Mvc 3_Serialization_Xsd - Fatal编程技术网

C# Xml序列化/反序列化索引项

C# Xml序列化/反序列化索引项,c#,xml,asp.net-mvc-3,serialization,xsd,C#,Xml,Asp.net Mvc 3,Serialization,Xsd,我有一个包含索引项的xml文件,如: <xml> <entry1> ... </entry1> <entry2> ... </entry2> </xml> 如何更改类,以便在运行serialize/deserialize时,它能够在xml和对象中识别并将它们命名为条目“n” 我需要使用相同类型的无限个条目,而更改xml是不可能的。鉴于您无法更改xml,您将无法使用xsd.exe为此xml

我有一个包含索引项的xml文件,如:

<xml>
   <entry1>
   ...
   </entry1>
   <entry2>
   ...
   </entry2>
</xml>
如何更改类,以便在运行serialize/deserialize时,它能够在xml和对象中识别并将它们命名为条目“n”


我需要使用相同类型的无限个条目,而更改xml是不可能的。

鉴于您无法更改xml,您将无法使用xsd.exe为此xml生成类
XmlSerializer
不内置对任意命名元素的支持,如
<代码>。您可以在根类中实现
IXmlSerializable
,从而启用
XmlSerializer
调用自定义(反)序列化代码,或者可以使用
XmlDocument
XmlReader
或(我的建议)
XDocument
直接读取XML,如果您认为有必要,构造一个对象模型

旁白:如果可能的话,对这个API进行回击。这违反了良好的XML设计。XML本质上是顺序的。XML读取
..
实际上应该是
..
。XML中的位置表示序列

编辑:根据OPs评论,我将添加此内容。如果您的XML确实很大,那么执行字符串替换可能不是最好的解决方案。您可以创建
XmlReader
的子类,用
元素替换
元素。您只需要覆盖
LocalName
属性。注意,我在这里不是很“安全”——任何以“entry”开头的元素或属性都会将其名称更改为“entry”。我会让你决定这对你来说是否足够。如果不是,则在替换名称之前,当然可以执行其他状态检查(例如,确保您在元素上)

// This class implements the LocalName override
private class CustomXmlReader : CustomXmlReaderBase
{
    // constructor
    public CustomXmlReader(XmlReader inner)
        : base(inner)
    {
    }

    // LocalName override
    public override string LocalName
    {
        get { return base.LocalName.StartsWith("entry") ? "entry" : base.LocalName; }
    }
}

// This class implements base behavior for an XML reader that wraps another XML reader.
private abstract class CustomXmlReaderBase : XmlReader
{
    protected CustomXmlReaderBase(XmlReader inner)
    {
        _inner = inner;
    }

    private readonly XmlReader _inner;

    public override string GetAttribute(string name)
    {
        return _inner.GetAttribute(name);
    }

    public override string GetAttribute(string name, string namespaceURI)
    {
        return _inner.GetAttribute(name, namespaceURI);
    }

    public override string GetAttribute(int i)
    {
        return _inner.GetAttribute(i);
    }

    public override bool MoveToAttribute(string name)
    {
        return _inner.MoveToAttribute(name);
    }

    public override bool MoveToAttribute(string name, string ns)
    {
        return _inner.MoveToAttribute(name, ns);
    }

    public override bool MoveToFirstAttribute()
    {
        return _inner.MoveToFirstAttribute();
    }

    public override bool MoveToNextAttribute()
    {
        return _inner.MoveToNextAttribute();
    }

    public override bool MoveToElement()
    {
        return _inner.MoveToElement();
    }

    public override bool ReadAttributeValue()
    {
        return _inner.ReadAttributeValue();
    }

    public override bool Read()
    {
        return _inner.Read();
    }

    public override string LookupNamespace(string prefix)
    {
        return _inner.LookupNamespace(prefix);
    }

    public override void ResolveEntity()
    {
        _inner.ResolveEntity();
    }

    public override XmlNodeType NodeType
    {
        get { return _inner.NodeType; }
    }

    public override string LocalName
    {
        get { return _inner.LocalName; }
    }

    public override string NamespaceURI
    {
        get { return _inner.NamespaceURI; }
    }

    public override string Prefix
    {
        get { return _inner.Prefix; }
    }

    public override string Value
    {
        get { return _inner.Value; }
    }

    public override int Depth
    {
        get { return _inner.Depth; }
    }

    public override string BaseURI
    {
        get { return _inner.BaseURI; }
    }

    public override bool IsEmptyElement
    {
        get { return _inner.IsEmptyElement; }
    }

    public override int AttributeCount
    {
        get { return _inner.AttributeCount; }
    }

    public override bool EOF
    {
        get { return _inner.EOF; }
    }

    public override ReadState ReadState
    {
        get { return _inner.ReadState; }
    }

    public override XmlNameTable NameTable
    {
        get { return _inner.NameTable; }
    }
}

是否有有限数量的条目?请更改您的xml<代码>……问题不清楚。是否要将类
entry1
entry2
合并为一个类
条目
,并使用该类生成XML元素
?和/或您想支持任意数量的
元素吗?@MichaelGunter我需要使用任意元素。@L.B我无法更改xml,我会这样接收它。。谢谢。这正是我需要知道的。我认为只使用一个类“entry”会更容易,在收到xml后,替换所有出现的字符串“entry1”、“entry2”。。通过“entry”,使用XmlSerializer可以填充对象,然后在回写xml后重复字符串replace。这是一个非常大的xml,我绝对不想一块一块地构建它。非常感谢你的帮助!是的,我确实同意这是一个非常糟糕的做法,这是我想到的第一件事。补充了一些额外的评论。
// This class implements the LocalName override
private class CustomXmlReader : CustomXmlReaderBase
{
    // constructor
    public CustomXmlReader(XmlReader inner)
        : base(inner)
    {
    }

    // LocalName override
    public override string LocalName
    {
        get { return base.LocalName.StartsWith("entry") ? "entry" : base.LocalName; }
    }
}

// This class implements base behavior for an XML reader that wraps another XML reader.
private abstract class CustomXmlReaderBase : XmlReader
{
    protected CustomXmlReaderBase(XmlReader inner)
    {
        _inner = inner;
    }

    private readonly XmlReader _inner;

    public override string GetAttribute(string name)
    {
        return _inner.GetAttribute(name);
    }

    public override string GetAttribute(string name, string namespaceURI)
    {
        return _inner.GetAttribute(name, namespaceURI);
    }

    public override string GetAttribute(int i)
    {
        return _inner.GetAttribute(i);
    }

    public override bool MoveToAttribute(string name)
    {
        return _inner.MoveToAttribute(name);
    }

    public override bool MoveToAttribute(string name, string ns)
    {
        return _inner.MoveToAttribute(name, ns);
    }

    public override bool MoveToFirstAttribute()
    {
        return _inner.MoveToFirstAttribute();
    }

    public override bool MoveToNextAttribute()
    {
        return _inner.MoveToNextAttribute();
    }

    public override bool MoveToElement()
    {
        return _inner.MoveToElement();
    }

    public override bool ReadAttributeValue()
    {
        return _inner.ReadAttributeValue();
    }

    public override bool Read()
    {
        return _inner.Read();
    }

    public override string LookupNamespace(string prefix)
    {
        return _inner.LookupNamespace(prefix);
    }

    public override void ResolveEntity()
    {
        _inner.ResolveEntity();
    }

    public override XmlNodeType NodeType
    {
        get { return _inner.NodeType; }
    }

    public override string LocalName
    {
        get { return _inner.LocalName; }
    }

    public override string NamespaceURI
    {
        get { return _inner.NamespaceURI; }
    }

    public override string Prefix
    {
        get { return _inner.Prefix; }
    }

    public override string Value
    {
        get { return _inner.Value; }
    }

    public override int Depth
    {
        get { return _inner.Depth; }
    }

    public override string BaseURI
    {
        get { return _inner.BaseURI; }
    }

    public override bool IsEmptyElement
    {
        get { return _inner.IsEmptyElement; }
    }

    public override int AttributeCount
    {
        get { return _inner.AttributeCount; }
    }

    public override bool EOF
    {
        get { return _inner.EOF; }
    }

    public override ReadState ReadState
    {
        get { return _inner.ReadState; }
    }

    public override XmlNameTable NameTable
    {
        get { return _inner.NameTable; }
    }
}