在xml文件中搜索给定的内部文本值,返回其父级

时间:2014-06-06 22:37:35

标签: c# xml parsing

我有一个看起来像这样的xml文档:

<MyDataSet>
    <Q>
        <SKU> Unique Value </SKU>
        <description> non unique </description>
    </Q>

    <Q>
       ...
    </Q>

     ... any number of <Q> elements ...

</MyDataSet

我想在这个XML文档中搜索给定的SKU,并可以从那里访问父Q节点。每个SKU都是独一无二的。有没有办法干净利落地这样做?我想从给定的SKU中提取项目的描述。我应该补充一点,我正在使用C#

3 个答案:

答案 0 :(得分:3)

如果您的XML包含在XDocument或类似的内容中,您可以简单地使用LINQ来执行您正在寻找的内容。这会产生第一个元素。

XDocument doc = XDocument.Load(filename); // Path to the XML file from the post.
XElement node = doc.Root.Elements("Q").Where(e => e.Element("SKU").Value == " Unique Value ").FirstOrDefault();

答案 1 :(得分:1)

您只需要使用LINQ,希望该示例可以帮助您:

XDocument document = XDocument.Load(filePath);
XElement wantedNode= document .Root.Elements("Q").Where(x => x.Element("SKU").Value == " Unique Value ").FirstOrDefault();

答案 2 :(得分:1)

如果您正在使用此文档做更多工作,则可能需要使用XmlSerializer。这是一些工作,但从长远来看会给你更好的表现和轻松。

使用模型

/// <remarks/>
        [System.SerializableAttribute()]
        [System.ComponentModel.DesignerCategoryAttribute("code")]
        [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
        [System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = false)]
        public partial class MyDataSet
        {

            private MyDataSetQ[] qField;

            /// <remarks/>
            [System.Xml.Serialization.XmlElementAttribute("Q")]
            public MyDataSetQ[] Q
            {
                get
                {
                    return this.qField;
                }
                set
                {
                    this.qField = value;
                }
            }
        }

        /// <remarks/>
        [System.SerializableAttribute()]
        [System.ComponentModel.DesignerCategoryAttribute("code")]
        [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
        public partial class MyDataSetQ
        {

            private string sKUField;

            private string descriptionField;

            /// <remarks/>
            public string SKU
            {
                get
                {
                    return this.sKUField;
                }
                set
                {
                    this.sKUField = value;
                }
            }

            /// <remarks/>
            public string description
            {
                get
                {
                    return this.descriptionField;
                }
                set
                {
                    this.descriptionField = value;
                }
            }
        }

那么这段代码

var serializer = new XmlSerializer(typeof(MyDataSet));
var xmlObject = (MyDataSet)serializer.Deserialize(STREAM);

STREAM可以是文件流或Web响应。它需要更多的工作设置,但如果你打算使用xml它是最好的方法。该类是使用具有PasteAsXml类型的vs gallery包制作的