【问题标题】:C#: How to add xml element at specific position in multiple records of xml fileC#:如何在xml文件的多条记录中的特定位置添加xml元素
【发布时间】:2019-12-15 18:00:00
【问题描述】:

我有一个包含多个表的大型 xml 文件。我想在特定位置添加一个元素。我试过了,但在我的情况下,元素终于被添加了,这对我的场景来说是不可取的。

我的表格是 xml 格式的。 TickerBroker , Broker, BrokerTab and TickerBrokerDateFormatMap

我有多个 Broker 元素,当我添加一个新的 Broker 时,它会在最后的 TickerBrokerDateFormatMap 元素之后添加到 xml 文件中。我想在 xml 文件中最后一个 Broker 元素的末尾添加 Broker 元素。

如果 xml 文件中不存在 Broker 元素,那么我的 Broker 元素应该添加到最后一个 TickerBroker 元素的末尾。

这里我给出了我的示例 xml 数据,它有点长。

<?xml version="1.0" standalone="yes"?>
<TickerBrokerDateMap>
  <TickerBroker>
    <Ticker_Id>ADBE</Ticker_Id>
    <Ticker_Id_auto>ADBE</Ticker_Id_auto>
  </TickerBroker>

  <Broker ID="MV-P1" Ticker_Id="ADBE" BrokerCategory="Cascade" Client="">
    <Broker_Id>25</Broker_Id>
    <ALLTabsUnderBroker>
      <Broker>MV-P1</Broker>
      <TAB>QIS</TAB>
      <Commnet1 />
      <Commnet2 />
      <Broker_Id>25</Broker_Id>
      <ReviewedEarnings>3Q 2019</ReviewedEarnings>
      <Pre-Post>Post</Pre-Post>
    </ALLTabsUnderBroker>
    <ALLTabsUnderBroker>
      <Broker>MV-P1</Broker>
      <TAB>BS</TAB>
      <Commnet1 />
      <Commnet2 />
      <Broker_Id>25</Broker_Id>
      <ReviewedEarnings>3Q 2019</ReviewedEarnings>
      <Pre-Post>Post</Pre-Post>
    </ALLTabsUnderBroker>
    <ALLTabsUnderBroker>
      <Broker>MV-P1</Broker>
      <TAB>METRICS</TAB>
      <Commnet1 />
      <Commnet2 />
      <Broker_Id>25</Broker_Id>
      <ReviewedEarnings>3Q 2019</ReviewedEarnings>
      <Pre-Post>Post</Pre-Post>
    </ALLTabsUnderBroker>
    <ALLTabsUnderBroker>
      <Broker>MV-P1</Broker>
      <TAB>ESTIMATE</TAB>
      <Commnet1 />
      <Commnet2 />
      <Broker_Id>25</Broker_Id>
      <ReviewedEarnings />
    </ALLTabsUnderBroker>
    <ALLTabsUnderBroker>
      <Broker>MV-P1</Broker>
      <TAB>EPS</TAB>
      <Commnet1 />
      <Commnet2 />
      <Broker_Id>25</Broker_Id>
      <ReviewedEarnings>3Q 2019</ReviewedEarnings>
      <Pre-Post>Post</Pre-Post>
    </ALLTabsUnderBroker>
  </Broker>
  <Broker ID="UN" Ticker_Id="ADBE" BrokerCategory="Contributing" Client="">
    <Broker_Id>27</Broker_Id>
    <ALLTabsUnderBroker>
      <Broker>UN</Broker>
      <TAB>ModelCover</TAB>
      <Commnet1 />
      <Commnet2 />
      <Broker_Id>27</Broker_Id>
      <ReviewedEarnings />
    </ALLTabsUnderBroker>
    <ALLTabsUnderBroker>
      <Broker>UN</Broker>
      <TAB>Assumptions</TAB>
      <Commnet1 />
      <Commnet2 />
      <Broker_Id>27</Broker_Id>
      <ReviewedEarnings />
    </ALLTabsUnderBroker>
    <ALLTabsUnderBroker>
      <Broker>UN</Broker>
      <TAB>Revenue Build</TAB>
      <Commnet1 />
      <Commnet2 />
      <Broker_Id>27</Broker_Id>
      <ReviewedEarnings>4Q2019</ReviewedEarnings>
      <Pre-Post>Pre</Pre-Post>
    </ALLTabsUnderBroker>
    <ALLTabsUnderBroker>
      <Broker>UN</Broker>
      <TAB>Segment Breakout</TAB>
      <Commnet1 />
      <Commnet2 />
      <Broker_Id>27</Broker_Id>
      <ReviewedEarnings />
    </ALLTabsUnderBroker>
    <ALLTabsUnderBroker>
      <Broker>UN</Broker>
      <TAB>Geographic Breakout</TAB>
      <Commnet1 />
      <Commnet2 />
      <Broker_Id>27</Broker_Id>
      <ReviewedEarnings>4Q2019</ReviewedEarnings>
      <Pre-Post>Pre</Pre-Post>
    </ALLTabsUnderBroker>
    <ALLTabsUnderBroker>
      <Broker>UN</Broker>
      <TAB>Calcs</TAB>
      <Commnet1 />
      <Commnet2 />
      <Broker_Id>27</Broker_Id>
      <ReviewedEarnings />
    </ALLTabsUnderBroker>
    <ALLTabsUnderBroker>
      <Broker>UN</Broker>
      <TAB>Debt</TAB>
      <Commnet1 />
      <Commnet2 />
      <Broker_Id>27</Broker_Id>
      <ReviewedEarnings />
    </ALLTabsUnderBroker>
    <ALLTabsUnderBroker>
      <Broker>UN</Broker>
      <TAB>GAAP Income Statement</TAB>
      <Commnet1 />
      <Commnet2 />
      <Broker_Id>27</Broker_Id>
      <ReviewedEarnings>4Q2019</ReviewedEarnings>
      <Pre-Post>Pre</Pre-Post>
    </ALLTabsUnderBroker>
    <ALLTabsUnderBroker>
      <Broker>UN</Broker>
      <TAB>Non-GAAP Income Statement</TAB>
      <Commnet1 />
      <Commnet2 />
      <Broker_Id>27</Broker_Id>
      <ReviewedEarnings>4Q2019</ReviewedEarnings>
      <Pre-Post>Pre</Pre-Post>
    </ALLTabsUnderBroker>
    <ALLTabsUnderBroker>
      <Broker>UN</Broker>
      <TAB>Balance Sheet</TAB>
      <Commnet1 />
      <Commnet2 />
      <Broker_Id>27</Broker_Id>
      <ReviewedEarnings>4Q2019</ReviewedEarnings>
      <Pre-Post>Pre</Pre-Post>
    </ALLTabsUnderBroker>
    <ALLTabsUnderBroker>
      <Broker>UN</Broker>
      <TAB>Cash Flow</TAB>
      <Commnet1 />
      <Commnet2 />
      <Broker_Id>27</Broker_Id>
      <ReviewedEarnings>4Q2019</ReviewedEarnings>
      <Pre-Post>Pre</Pre-Post>
    </ALLTabsUnderBroker>
    <ALLTabsUnderBroker>
      <Broker>UN</Broker>
      <TAB>Disclosures</TAB>
      <Commnet1 />
      <Commnet2 />
      <Broker_Id>27</Broker_Id>
      <ReviewedEarnings />
    </ALLTabsUnderBroker>
  </Broker>
  <Broker ID="BW" Ticker_Id="ADBE" BrokerCategory="NonContributing" Client="">
    <Broker_Id>28</Broker_Id>
    <ALLTabsUnderBroker>
      <Broker>BW</Broker>
      <TAB>Adobe Model_Stifel</TAB>
      <Commnet1 />
      <Commnet2 />
      <Broker_Id>28</Broker_Id>
      <ReviewedEarnings>4Q 2019</ReviewedEarnings>
      <Pre-Post>Pre</Pre-Post>
    </ALLTabsUnderBroker>
    <ALLTabsUnderBroker>
      <Broker>BW</Broker>
      <TAB>Disclaimer (Read first)</TAB>
      <Commnet1 />
      <Commnet2 />
      <Broker_Id>28</Broker_Id>
      <ReviewedEarnings />
    </ALLTabsUnderBroker>
    <ALLTabsUnderBroker>
      <Broker>BW</Broker>
      <TAB>Sources</TAB>
      <Commnet1 />
      <Commnet2 />
      <Broker_Id>28</Broker_Id>
      <ReviewedEarnings />
    </ALLTabsUnderBroker>
  </Broker>
  <Broker ID="PJ-C1" Ticker_Id="ADBE" BrokerCategory="Contributing" Client="">
    <Broker_Id>29</Broker_Id>
    <ALLTabsUnderBroker>
      <Broker>PJ-C1</Broker>
      <TAB>IS</TAB>
      <Commnet1>Use Custom</Commnet1>
      <Commnet2>Use Custom</Commnet2>
      <Broker_Id>29</Broker_Id>
      <ReviewedEarnings>4Q 2019</ReviewedEarnings>
      <Pre-Post>Pre</Pre-Post>
    </ALLTabsUnderBroker>
    <ALLTabsUnderBroker>
      <Broker>PJ-C1</Broker>
      <TAB>BS</TAB>
      <Commnet1>Use Custom</Commnet1>
      <Commnet2>Use Custom</Commnet2>
      <Broker_Id>29</Broker_Id>
      <ReviewedEarnings>4Q 2019</ReviewedEarnings>
      <Pre-Post>Pre</Pre-Post>
    </ALLTabsUnderBroker>
    <ALLTabsUnderBroker>
      <Broker>PJ-C1</Broker>
      <TAB>CF</TAB>
      <Commnet1>Use Custom</Commnet1>
      <Commnet2>Use Custom</Commnet2>
      <Broker_Id>29</Broker_Id>
      <ReviewedEarnings>4Q 2019</ReviewedEarnings>
      <Pre-Post>Pre</Pre-Post>
    </ALLTabsUnderBroker>
    <ALLTabsUnderBroker>
      <Broker>PJ-C1</Broker>
      <TAB>Segment Breakout</TAB>
      <Commnet1>Use Custom</Commnet1>
      <Commnet2>Use Custom</Commnet2>
      <Broker_Id>29</Broker_Id>
      <ReviewedEarnings>4Q 2019</ReviewedEarnings>
      <Pre-Post>Pre</Pre-Post>
    </ALLTabsUnderBroker>
  </Broker>
  <BrokerTab name="IS" Broker_Id="0" Ticker_Id="ADBE" Revise_Date="11-19-2019">
    <BrokerTab_Id>0</BrokerTab_Id>
    <Tab_index>0</Tab_index>
    <save_flag>true</save_flag>
    <isUSed>true</isUSed>
  </BrokerTab>
  <BrokerTab name="Drivers" Broker_Id="0" Ticker_Id="ADBE" Revise_Date="11-19-2019">
    <BrokerTab_Id>1</BrokerTab_Id>
    <Tab_index>1</Tab_index>
    <save_flag>true</save_flag>
    <isUSed>true</isUSed>
  </BrokerTab>
  <BrokerTab name="BS" Broker_Id="0" Ticker_Id="ADBE" Revise_Date="11-19-2019">
    <BrokerTab_Id>2</BrokerTab_Id>
    <Tab_index>2</Tab_index>
    <save_flag>true</save_flag>
    <isUSed>true</isUSed>
  </BrokerTab>
  <BrokerTab name="CF" Broker_Id="0" Ticker_Id="ADBE" Revise_Date="11-19-2019">
    <BrokerTab_Id>3</BrokerTab_Id>
    <Tab_index>3</Tab_index>
    <save_flag>true</save_flag>
    <isUSed>true</isUSed>
  </BrokerTab>
  <TickerBrokerDateFormatMap BrokerTab_Id="154" Broker_Id="29" Ticker_Id="ADBE">
    <StandardDate>2021 FYE</StandardDate>
    <ColumnCoordinate>AQ</ColumnCoordinate>
    <TickerBrokerDateFormatMaps_Id>168</TickerBrokerDateFormatMaps_Id>
    <BrokerDate StandardDate="2021 FYE" Broker_Id="29" BrokerTab_Id="154">
      <year>2021 FYE</year>
      <Quater>2021 FYE</Quater>
    </BrokerDate>
  </TickerBrokerDateFormatMap>
</TickerBrokerDateMap>

在这里,我给出了我的 C# 代码来添加 xml 代理元素,该元素添加到文件末尾,这是不可取的。

    string srclocalfile = @"C:\FILE1.xml";
    string strZipBrokerID = "10";
    string strSourceBrokerID = "12";
    string broker = "UN";

    XDocument xmlDocZip = XDocument.Load(srclocalfile);

    var zipbrokerrow = xmlDocZip.Descendants().Elements("Broker").FirstOrDefault(b => b.Attribute("ID").Value.ToString().Trim().Equals(broker));

    if (zipbrokerrow != null)
    {

        XElement oSubElm = null;
        XElement brokerelement = new XElement("Broker",
            new XAttribute("ID", broker),
            new XAttribute("Ticker_Id", strTicker),
            new XAttribute("BrokerCategory", zipbrokerrow.Attribute("BrokerCategory").Value),
            new XAttribute("Client", zipbrokerrow.Attribute("Client").Value),
            new XElement("Broker_Id", strSourceBrokerID));

        foreach (XElement e in zipbrokerrow.Descendants("ALLTabsUnderBroker"))
        {
            string _broker = e.Element("Broker").Value;
            string _TAB = e.Element("TAB").Value;
            string _Commnet1 = e.Element("Commnet1").Value;
            string _Commnet2 = e.Element("Commnet2").Value;
            string _Broker_Id = e.Element("Broker_Id").Value;
            string _ReviewedEarnings = e.Element("ReviewedEarnings").Value;

            oSubElm = new XElement("ALLTabsUnderBroker",
                new XElement("Broker", _broker),
                new XElement("TAB", _TAB),
                new XElement("Commnet1", _Commnet1),
                new XElement("Commnet2", _Commnet2),
                new XElement("Broker_Id", _Broker_Id),
                new XElement("ReviewedEarnings", _ReviewedEarnings));

            brokerelement.Add(oSubElm);

        }

        xmlDocZip.Root.Descendants("Broker").FirstOrDefault().Parent.Add(brokerelement);
        xmlDocZip.Save(srclocalfile);
    }

看,我正在使用 XDocument 类,所以请使用 XDocument 发布任何示例代码。谢谢

【问题讨论】:

  • 你太复杂了:XElement dataMap = xmlDocZip.Root; dataMap.Add(brokerelement);

标签: c# xml linq-to-xml


【解决方案1】:

你应该看看XNode.AddAfterSelf Method

这些方法完全符合您的要求:

在此节点之后立即添加指定的内容。

例子:

xmlDocZip.Root.Descendants("Broker").LastOrDefault()?.AddAfterSelf(brokerelement);

在调用 AddAfterSelf 之前验证 LastOrDefault 是否不会返回 null 很重要,否则会抛出 NullReferenceException。

// If xml has any Broker tag
if(xmlDocZip.Root.Descendants("Broker").Any())
{
    xmlDocZip.Root.Descendants("Broker").LastOrDefault().AddAfterSelf(brokerelement);
}
else if (xmlDocZip.Root.Descendants("TickerBroker").Any())
{
    xmlDocZip.Root.Descendants("TickerBroker").LastOrDefault().AddAfterSelf(brokerelement);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-16
    相关资源
    最近更新 更多