簡體   English   中英

獲取XML節點的內部文本

[英]Getting innertext of XML node

當我嘗試M Adeel Khalid kode時,我一無所獲,而嘗試其他人時,我會出錯。 我想念一些東西,但我無法把握。 我的代碼如下所示。 但是我在后代上出錯,說“ xmlDocument不包含后代定義”。您可能會看到,我對此很陌生,所以請耐心等待。

 protected void btnRetVare_Click(object sender, EventArgs e)
{
    fldRetVare.Visible = true;
    try
    {
        functions func = new functions();
       bool exists = func.checForMatch(txtRetVare.Text);
        string myNumber = txtRetVare.Text;

        if (Page.IsValid)
        {
            if (!exists)
            {
                txtRetVare.Text= "Varenummer findes ikke";
            }
            else
            {
                XmlDocument xmldoc = new XmlDocument();
                //xmldoc.Load(Server.MapPath(map));
                xmldoc.LoadXml(Server.MapPath(map));

                //var Varenummer2055component = xmldoc.SelectNodes("s/Reservedele/Component[Varenummer/text()='"+txtRetVare+"']/Remarks");

                //if (Varenummer2055component.Count == 1)
                //{
                //    var remarks = Varenummer2055component[0].InnerText;
                //    txtRetBemærkninger.Text = remarks.ToString();
                //}

                string remarks = (from xml2 in xmldoc.Descendants("Component")
                                  where xml2.Element("Varenummer").Value == txtRetVare.Text
                                  select xml2.Element("Remarks")).FirstOrDefault().Value;

                txtRetBemærkninger.Text = remarks;



            }

        }

您可以通過這種方式獲得它。

    XDocument xdoc = XDocument.Load(XmlPath);
    string remarks = (from xml2 in xdoc.Descendants("Component")
                                    where xml2.Element("Varenummer").Value == "2055"
                                    select xml2.Element("Remarks")).FirstOrDefault().Value;

我已經測試了這段代碼。 希望能幫助到你。

使用XPath選擇正確的節點:

XmlDocument xml = new XmlDocument();
xml.LoadXml(@"
<Reservedele>
      <Component>
        <Type>Elektronik</Type>
        <Art>Wheel</Art>
        <Remarks>erter</Remarks>
        <Varenummer>2055</Varenummer>
        <OprettetAf>jg</OprettetAf>
        <Date>26. januar 2017</Date>
      </Component>
      <Component>
        <Type>Forbrugsvarer</Type>
        <Art>Bulb</Art>
        <Remarks>dfdh</Remarks>
        <Varenummer>2055074</Varenummer>
        <OprettetAf>jg</OprettetAf>
        <Date>27. januar 2017</Date>
      </Component>
</Reservedele>");

var Varenummer2055component = xml.SelectNodes("s/Reservedele/Component[Varenummer/text()='2055']/Remarks");

if (Varenummer2055component.Count == 1)
{
    var remarks = Varenummer2055component[0].InnerText;
}

我想擴展方法FirstLINQ到XML將是你的問題很簡單,並填寫要求。

var document = XDocument.Load(pathTopXmlFile);
var remark = 
    document.Descendants("Component")
            .First(component => component.Element("Varenummer").Value.Equals("2055"))
            .Element("Remarks")
            .Value;

如果xml不包含Varenummer = 2055元素,則First方法將引發異常

如果xml文件中不存在給定數字,則可以使用FirstOrDefault擴展方法並添加對null檢查

var document = XDocument.Load(pathTopXmlFile);
var component = 
    document.Descendants("Component")
            .FirstOrDefault(comp => comp.Element("Varenummer").Value.Equals("2055"));

var remark = component != null ? component.Element("Remarks").Value : null;

為了保存新值,您可以使用相同的“方法”,並在設置新值后將其保存到同一文件中

var document = XDocument.Load(pathTopXmlFile);
var component = 
    document.Descendants("Component")
            .FirstOrDefault(comp => comp.Element("Varenummer").Value.Equals("2055"));

component.Element("Remarks").Value = newValueFromTextBox;

document.Save(pathTopXmlFile);

還有另一種方法,在您的特定情況下可能會顯得過大,但是如果您使用xml的其他值,則可能會很有用。 這種方法是序列化。

您可以創建代表xml文件數據的類,然后僅使用序列化將數據加載和保存到文件中。 XML序列化的示例

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM