繁体   English   中英

根据条件循环遍历两个XElement

[英]Loop through two XElements based on Condition

我想循环一个XML树并测试两个条件,并发现了一些问题。

  1. 我无法比较像Integer这样的XElement。 除了本示例,我还阅读了其他一些文章,但到目前为止我还不清楚。 :S

LINK_1

LINK_2

  1. 在foreach循环中,我只能更改第一个匹配的元素,而我想对所有匹配的XElement都这样做。 我尝试了Any()和All(),但未成功。

我的XML文件:(用于蛋白质)

<?xml version="1.0" encoding="utf-8"?>
<ProteinStructure>
  <SecondaryStructure>
    <StName>HELX_P1</StName>
    <StType>alphaHelix</StType>
    <AmAcidStart>1</AmAcidStart>
    <AmAcidEnd>2</AmAcidEnd>
  </SecondaryStructure>
  <SecondaryStructure>
    <StName>HELX_P2</StName>
    <StType>alphaHelix</StType>
    <AmAcidStart>43</AmAcidStart>
    <AmAcidEnd>53</AmAcidEnd>
  </SecondaryStructure>

我的XML文件:(用于atom)

<?xml version="1.0" encoding="utf-8"?>
<Molecule>
  <Atom>
    <AtNum>1</AtNum>
    <AmAcSeq>2</AmAcSeq>
    <AtType>N</AtType>
    <StType>turn</StType>
  </Atom>
  <Atom>
    <AtNum>2</AtNum>
    <AmAcSeq>2</AmAcSeq>
    <AtType>CA</AtType>
    <StType>turn</StType>
  </Atom>
  <Atom>
    <AtNum>2</AtNum>
    <AmAcSeq>2</AmAcSeq>
    <AtType>C</AtType>
    <StType>turn</StType>
  </Atom>
  <Atom>
    <AtNum>1</AtNum>
    <AmAcSeq>3</AmAcSeq>
    <AtType>N</AtType>
    <StType>turn</StType>
  </Atom>

到目前为止,我的代码:

  XDocument atom = XDocument.Load (@"C:\\Users\\RuiGarcia\\Documents\\MIB\\INESC\\C#Tutorial\\ProjectC#\\Molecule_00\\PDBLibary_00\\Data\\__3Q26.xml"); XDocument protein = XDocument.Load (@"C:\\Users\\RuiGarcia\\Documents\\MIB\\INESC\\C#Tutorial\\ProjectC#\\Molecule_00\\PDBLibary_00\\Data\\_3Q26.xml"); //Change secondary structure tag type "turn" to helixAlpha or betaSheet foreach (XElement amAc in protein.Descendants ("SecondaryStructure")) { atom.Element ("Molecule") .Elements ("Atom") .Where (x => (int?)x.Element("AmAcSeq") >= (int?)amAc.Element("AmAcidStart") && x => (int?)ToInt16.x.Element ("AmAcSeq") <= (int?)amAc.Element("AmAcidEnd")) .Select (x => x.Element("StType")).FirstOrDefault().SetValue(amAc.Element("StType")); // Console.WriteLine (amAc.Element("AmAcidStart").Value); // .Where (x => Convert.ToInt16(x.Element("AmAcSeq").Value) <= Convert.ToInt16(amAc.Element("AmAcidStart").Value) && x => Convert.ToInt16(x.Element ("AmAcSeq").Value) >= Convert.ToInt16(amAc.Element("AmAcidStart"))) // .Where (x => (int?)x.Element("AmAcSeq") >= (int?)amAc.Element("AmAcidStart") && x => (int?)ToInt16.x.Element ("AmAcSeq") <= (int?)amAc.Element("AmAcidStart")) } atom.Save(@"C:\\Users\\RuiGarcia\\Documents\\MIB\\INESC\\C#Tutorial\\ProjectC#\\Molecule_00\\PDBLibary_00\\Data\\__3Q26.xml"); 

PS-如何正确格式化代码而不在代码示例中将其分开?

提前致谢。

您需要第二个foreach来遍历结果。 我提出了一些价值观,并在下面举例说明了这一点。

XDocument atom = XDocument.Load (@"...\__3Q26.xml");
XDocument protein = XDocument.Load (@"...\_3Q26.xml");

//Change secondary structure tag type "turn" to helixAlpha or betaSheet
foreach (XElement amAc in protein.Descendants ("SecondaryStructure"))
{
    int? start = (int?)amAc.Element("AmAcidStart");
    int? end = (int?)amAc.Element("AmAcidEnd");
    string stType = (string)amAc.Element("StType");

    IEnumerable<XElement> atoms = atom.Element("Molecule").Elements("Atom");

    // Here we are iterating again in each matching result
    foreach (XElement atomElement in atoms.Where(elem => (int?)elem.Element("AmAcSeq") >= start && (int?)elem.Element("AmAcSeq") <= end))
    {
        atomElement.SetValue(stType);
    }
}

我在这里看到几个问题:

  1. 您需要使用嵌套的foreach循环,而不是FirstOrDefault()
  2. 您的条件(int?)ToInt16.x.Element ("AmAcSeq") <= (int?)amAc.Element("AmAcidStart")甚至都不会编译,并且几乎应该像(int?)x.Element ("AmAcSeq") <= (int?)amAc.Element("AmAcidEnd"))

从而:

        foreach (XElement secondaryStructure in protein.Descendants ("SecondaryStructure"))
        {
            foreach (var atomStType in atom.Element ("Molecule")
                .Elements ("Atom")
                .Where(a => (int?)a.Element("AmAcSeq") >= (int?)secondaryStructure.Element("AmAcidStart") && (int?)a.Element("AmAcSeq") <= (int?)secondaryStructure.Element("AmAcidEnd"))
                .Select (a => a.Element("StType")))
            {
                atomStType.SetValue((string)secondaryStructure.Element("StType"));
            }
        }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM