0

少し前に似たような事例があったので投稿しました。今、私は次の港にいますが、残念ながら少し複雑です。問題は、クラスを次の形式で完全に XML に変換することです。

<ENTITIES>
  <ENTITY name="S40">
    <ATTRIBUTES>
      <ATTRIBUTE name="INSOBJECT">X</ATTRIBUTE>
      <ATTRIBUTE name="INSOBJECTTYP">X</ATTRIBUTE>
    </ATTRIBUTES>
  </ENTITY>
  <ENTITY name="S41">
    <ATTRIBUTES>
      <ATTRIBUTE name="INSOBEZ">X</ATTRIBUTE>
      <ATTRIBUTE name="/SDE/CD_FDATE">X</ATTRIBUTE>
      <ATTRIBUTE name="/SDE/CD_COL_FORM">X</ATTRIBUTE>
      <ATTRIBUTE name="/SDE/CD_APPLNR">X</ATTRIBUTE>
      <ATTRIBUTE name="/SDE/CD_POLBEG">X</ATTRIBUTE>
    </ATTRIBUTES>
  </ENTITY>

これに関する問題は、ここの変数が XML 形式に変換されると同時に "ATTRIBUTES" という名前の新しい XmlElement が必要になるため、見栄えが良いことです。しかし、WITH属性の新しいアイテムを作成できるので、String.Replaceを考えました... 残念ながら、問題はありますが、それとは異なるものがいくつかあるため、簡単に置き換えることができません。残念ながら、XML 形式に切り替えることもできません。この形式は私に与えられたものであり、他のユーザーが既に使用しているためです。

私のやり方:

[System.Xml.Serialization.XmlRoot("ENTITIES")]
public class ivRequester
{

    private s_40[] s40;
    private s_41[] s41;
    private s_42[] s42;
    private s_43[] s43;
    private s_45[] s45;
    private c_99[] c99;

    public s_40[] S40
    {
        get { return s40; }
        set { s40 = value; }
    }
    public s_41[] S41
    {
        get { return s41; }
        set { s41 = value; }
    }
    public s_42[] S42
    {
        get { return s42; }
        set { s42 = value; }
    }
    public s_43[] S43
    {
        get { return s43; }
        set { s43 = value; }
    }
    public s_45[] S45
    {
        get { return s45; }
        set { s45 = value; }
    }
    public c_99[] C99
    {
        get { return c99; }
        set { c99 = value; }
    }

    public class s_40
    {
        public string INSOBJECT = "X";
        public string INSOBJECTTYP = "X";
        public string CD_OLDOBJNR = "X";
    }

    public class s_41
    {
        public string INSOBEZ = "X";
        public string slashSDEslashCD_FDATE = "X";
        public string slashSDEslashCD_COL_FORM = "X";
        public string slashSDEslashCD_APPLNR = "X";
    }

    public class s_42
    {
        public string PARTNER = "X";
        public string PARTNER_EXT = "X";
        public string PARTNER_ADEXT = "X";
    }

    public class s_43
    {
        public string partner = "X";
    }

    public class s_45
    {
        public string PARTNER = "X";
        public string PARTNER_EXT = "X";
        public string PARTNER_ADEXT = "X";
    }

    public class c_99
    {
        public string CODE = "X";
        public string MV_MESSAGE = "X";
        public string MV_MSGTY = "X";
    }

    public string XMLout()
    {
        string returnstring = Program.ObjectToXml(this);

        Console.WriteLine(returnstring);

        string[] toreplace = {"INSOBJECT", "INSOBJECTTYP", "CD_OLDOBJNR", "CD_BRANCH", "PARTNER", "PARTNER_EXT", "PARTNER_ADEXT", ... };

        for (int i = 0; i < toreplace.Length; i++)
        {
            returnstring = returnstring.Replace("<" + toreplace[i] + ">", "<ATTRIBUTE name=\"" + toreplace[i] + "\">");
            returnstring = returnstring.Replace("</" + toreplace[i] + ">", "</ATTRIBUTE>");
            returnstring = returnstring.Replace("<" + toreplace[i] + "/>", "<ATTRIBUTE name=\"" + toreplace[i] + "\"/>");
            returnstring = returnstring.Replace("<" + toreplace[i] + " />", "<ATTRIBUTE name=\"" + toreplace[i] + "\"/>");
        }
        returnstring = returnstring.Replace("slashSDEslash", "/SDE/");
        returnstring = returnstring.Replace("<ENTITIES xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">", "<ENTITIES>");
        string[] EntitiesToReplace = { "S40", "S41", "S42", "S43", "S45", "C99" };
        for (int i = 0; i < EntitiesToReplace.Length; i++)
        {
            returnstring = returnstring.Replace("<" + EntitiesToReplace[i] + ">", "<ENTITY name=\"" + EntitiesToReplace[i] + "\">");
            returnstring = returnstring.Replace("</" + EntitiesToReplace[i] + ">", "</ENTITY>");
            returnstring = returnstring.Replace("<" + EntitiesToReplace[i] + "/>", "<ENTITY name=\"" + EntitiesToReplace[i] + "\"/>");
            returnstring = returnstring.Replace("<" + EntitiesToReplace[i] + " />", "<ENTITY name=\"" + EntitiesToReplace[i] + "\"/>");
        }
        string[] ChangeToAttributes = { "s_40", "s_41", "s_42", "s_43", "s_45", "c_99" };
        for (int i = 0; i < ChangeToAttributes.Length; i++)
        {
            returnstring = returnstring.Replace("<" + ChangeToAttributes[i] + ">", "<ATTRIBUTES>");
            returnstring = returnstring.Replace("</" + ChangeToAttributes[i] + ">", "</ATTRIBUTES>");
            returnstring = returnstring.Replace("<" + ChangeToAttributes[i] + "/>", "<ATTRIBUTES/>");
            returnstring = returnstring.Replace("<" + ChangeToAttributes[i] + " />", "<ATTRIBUTES/>");
        }

        return returnstring;
    }

    public ivRequester XMLin(string XMLCode)
    {
        Console.WriteLine(XMLCode);
        string returnstring = XMLCode;

        string[] toreplace = { "INSOBJECT", "INSOBJECTTYP", "CD_OLDOBJNR", "CD_BRANCH", "PARTNER", "PARTNER_EXT", "PARTNER_ADEXT", "VALID_FROM", "AEND_TMS", "FUNCTION", "USERNAME", "HOSTUSER", "SOURCE", "INSOBEZ", ... };

        for (int i = 0; i < toreplace.Length; i++)
        {
            returnstring = returnstring.Replace("<ATTRIBUTE name=\"" + toreplace[i] + "\">", "<" + toreplace[i] + ">");
            returnstring = returnstring.Replace("</ATTRIBUTE>", "</" + toreplace[i] + ">");
            returnstring = returnstring.Replace("<ATTRIBUTE name=\"" + toreplace[i] + "\"/>", "<" + toreplace[i] + "/>");
            returnstring = returnstring.Replace("<ATTRIBUTE name=\"" + toreplace[i] + "\"/>", "<" + toreplace[i] + " />");
        }
        returnstring = returnstring.Replace("/SDE/", "slashSDEslash");
        returnstring = returnstring.Replace("<ENTITIES>", "<ENTITIES xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">");
        string[] EntitiesToReplace = { "S40", "S41", "S42", "S43", "S45", "C99" };
        for (int i = 0; i < EntitiesToReplace.Length; i++)
        {
            returnstring = returnstring.Replace("<ENTITY name=\"" + EntitiesToReplace[i] + "\">", "<" + EntitiesToReplace[i] + ">");
            returnstring = returnstring.Replace("</ENTITY>", "</" + EntitiesToReplace[i] + ">");
            returnstring = returnstring.Replace("<ENTITY name=\"" + EntitiesToReplace[i] + "\"/>", "<" + EntitiesToReplace[i] + "/>");
            returnstring = returnstring.Replace("<ENTITY name=\"" + EntitiesToReplace[i] + "\"/>", "<" + EntitiesToReplace[i] + " />");
        }

        ivRequester test = new ivRequester();//<--Search for better way to do that... i want to give THIS as return, but that is coming next or somthing else ;)
        try
        {
            XmlSerializer serializer = new XmlSerializer(this.GetType());

            test = (ivRequester)serializer.Deserialize(new StringReader(returnstring)); //<--Search for better way to do that... i want to give THIS as return, but that is coming next or somthing else ;)
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
            return test;
        }
        return test;
    }

以前に [XmlAttribute ()] と [XmlElement ()] を試したことがありますが、残念ながら、そのようなものではそれ以上は得られませんでした。そんなに時間が足りなかった頃だったら String.Replace なんて言うのは絶対にそんなものには向いてないんだろうけど、とにかく全部を印刷するときに <...> で SPECIFIED するなんてありえないと思った頃には... に変換するときXML は問題ありませんが、残念ながら XML コードをクラスに戻すことはできません。なぜなら、財務諸表はすべて同じ名前 ( および ) を持っているからです。したがって、XmlElement WITH ATTRIBUTE 製品をシリアル化する方法があるか (しかし明らかに存在しない)、ノードがこれの名前を変更することさえできないため、構築されているように、より優れた XML パーサーが必要ですか。-.-

誰かが私にヒントをくれることを願っています、Szandor

PS: ATTRIBUTE という追加のクラスも試しましたが、属性名と値の名前を入力する必要がありました。残念ながら、2 番目の ATTRIBUTES 時間が XmlElement として設定されている場合、これは機能しません。クラッシュします... 2 番目に Attribute2 を呼び出すと、それは実行されますが、すべての HOT MUST ATTRIBUTE が残念ながら使用できないため、:(

public class Attribute
{
    [XmlAttribute("name")]
    public string name;
    [XmlText()]
    public string wert;
}

public class s_40
{
    [XmlElement("ATTRIBUTE")]
    public Attribute INSOBJECT2 = new Attribute() { name = "INSOBJECT", wert = "test" };
    [XmlElement("ATTRIBUTE")]
    public Attribute INSOBJECTTYP2 = new Attribute() { name = "INSOBJECTTYP", wert = "test" };
    ...
}
4

1 に答える 1

0

この方法で解決されたのは、実際には多くのコードではなく、機能します:)

XmlDocument OriginalXML = new XmlDocument();
XmlDocument ConvertedXML = new XmlDocument();
OriginalXML.LoadXml(XMLCode);
ConvertedXML.LoadXml("<ENTITIES xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"></ENTITIES>");

XmlNode rootNodeOriginal = OriginalXML.SelectSingleNode("/ENTITIES");
XmlNode rootNodeConverted = ConvertedXML.SelectSingleNode("/ENTITIES");
string EntityName = "";
string EntityName2 = "";
foreach (XmlNode EntityNodes in rootNodeOriginal.ChildNodes)
{
    if (EntityNodes.Name == "ENTITY")
    {
        EntityName = EntityNodes.Attributes[0].InnerXml;
        EntityName2 = EntityName.Replace("S","s_").Replace("C","c_");
        XmlNode newNode = ConvertedXML.CreateElement(EntityName);
        rootNodeConverted.AppendChild(newNode);
        ConvertedXML.SelectSingleNode("/ENTITIES/" + EntityName).AppendChild(ConvertedXML.CreateElement(EntityName2));

        if (EntityNodes.FirstChild.Name == "ATTRIBUTES")
            foreach (XmlNode ChildNodeToChange in EntityNodes.FirstChild.ChildNodes)
                if (ChildNodeToChange.Name == "ATTRIBUTE")
                {
                    XmlNode newChildNodes = ConvertedXML.CreateElement(ChildNodeToChange.Attributes[0].InnerXml.Replace("/","slash"));
                    newChildNodes.InnerXml = ChildNodeToChange.InnerXml;
                    ConvertedXML.SelectSingleNode("/ENTITIES/" + EntityName + "/" + EntityName2).AppendChild(newChildNodes);
                }
    }
}
于 2012-06-05T15:35:21.413 に答える